[poincare] Change signature: polynomialDegree,

getPolynomialCoefficients, getPolynomialReducedCoefficients
This commit is contained in:
Émilie Feral
2018-09-26 17:00:32 +02:00
parent b6465ecba5
commit bc2ce86825
39 changed files with 72 additions and 69 deletions

View File

@@ -150,7 +150,7 @@ EquationStore::Error EquationStore::exactSolve(Poincare::Context * context) {
} else {
/* 2- Polynomial & Monovariable? */
assert(numberOfVariables == 1 && numberOfDefinedModels() == 1);
char x = m_variables[0];
const char x[] = {m_variables[0], 0};
Expression polynomialCoefficients[Expression::k_maxNumberOfPolynomialCoefficients];
int degree = definedModelAtIndex(0)->standardForm(context).getPolynomialReducedCoefficients(x, polynomialCoefficients, *context, preferences->angleUnit());
if (degree == 2) {

View File

@@ -26,8 +26,8 @@ public:
// Properties
Type type() const override { return Type::Addition; }
int polynomialDegree(Context & context, char symbolName) const override;
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
// Evaluation
template<typename T> static Complex<T> compute(const std::complex<T> c, const std::complex<T> d) { return Complex<T>(c+d); }
@@ -81,7 +81,7 @@ public:
// Expression
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit);
Expression shallowBeautify(Context & context, Preferences::AngleUnit angleUnit);
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
private:
static const Number NumeralFactor(const Expression & e);
static inline int NumberOfNonNumeralFactors(const Expression & e);

View File

@@ -21,7 +21,7 @@ public:
// Properties
Type type() const override { return Type::ConfidenceInterval; }
int polynomialDegree(Context & context, char symbolName) const override { return -1; }
int polynomialDegree(Context & context, const char * symbolName) const override { return -1; }
private:
// Layout
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;

View File

@@ -22,7 +22,7 @@ public:
// Properties
Type type() const override { return Type::Derivative; }
int polynomialDegree(Context & context, char symbolName) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
private:
// Layout

View File

@@ -25,7 +25,7 @@ public:
// Properties
Type type() const override { return Type::Division; }
int polynomialDegree(Context & context, char symbolName) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
// Approximation
virtual Evaluation<float> approximate(SinglePrecision p, Context& context, Preferences::AngleUnit angleUnit) const override {

View File

@@ -19,7 +19,7 @@ public:
// ExpressionNode
Type type() const override { return Type::Equal; }
int polynomialDegree(Context & context, char symbolName) const override { return -1; }
int polynomialDegree(Context & context, const char * symbolName) const override { return -1; }
private:
// Simplification
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit) override;

View File

@@ -123,7 +123,7 @@ public:
/* polynomialDegree returns:
* - (-1) if the expression is not a polynome
* - the degree of the polynome otherwise */
int polynomialDegree(Context & context, char symbolName) const { return this->node()->polynomialDegree(context, symbolName); }
int polynomialDegree(Context & context, const char * symbolName) const { return this->node()->polynomialDegree(context, symbolName); }
/* getVariables fills the table variables with the variable present in the
* expression and returns the number of entries in filled in variables.
* For instance getVariables('x+y+2*w/cos(4)') would result in
@@ -214,7 +214,7 @@ protected:
void removeChildrenInPlace(int currentNumberOfChildren) = delete;
/* Properties */
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { return node()->getPolynomialCoefficients(context, symbolName, coefficients); }
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const { return node()->getPolynomialCoefficients(context, symbolName, coefficients); }
/* Simplification */
Expression denominator(Context & context, Preferences::AngleUnit angleUnit) const { return node()->denominator(context, angleUnit); }
@@ -232,7 +232,7 @@ private:
/* Properties */
Expression defaultReplaceSymbolWithExpression(const char * symbol, Expression expression);
int defaultGetPolynomialCoefficients(Context & context, char symbol, Expression expression[]) const;
int defaultGetPolynomialCoefficients(Context & context, const char * symbol, Expression expression[]) const;
/* Expression roots/extrema solver*/
constexpr static double k_solverPrecision = 1.0E-5;

View File

@@ -101,8 +101,8 @@ public:
virtual bool isNumber() const { return false; }
/*!*/ virtual Expression replaceSymbolWithExpression(const char * symbol, Expression & expression);
/*!*/ virtual Expression setSign(Sign s, Context & context, Preferences::AngleUnit angleUnit);
virtual int polynomialDegree(Context & context, char symbolName) const;
/*!*/ virtual int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
virtual int polynomialDegree(Context & context, const char * symbolName) const;
/*!*/ virtual int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
typedef bool (*isVariableTest)(char c);
virtual int getVariables(Context & context, isVariableTest isVariable, char * variables) const;
virtual float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const;

View File

@@ -18,8 +18,8 @@ public:
// Properties
Type type() const override { return Type::Function; }
int polynomialDegree(Context & context, char symbolName) const override;
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
int getVariables(Context & context, isVariableTest isVariable, char * variables) const override;
float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const override;

View File

@@ -19,7 +19,7 @@ public:
// ExpressionNode
Type type() const override { return Type::Integral; }
int polynomialDegree(Context & context, char symbolName) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
private:
// Layout
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;

View File

@@ -36,7 +36,7 @@ public:
// Properties
Type type() const override { return Type::Matrix; }
int polynomialDegree(Context & context, char symbolName) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
// Approximation
Evaluation<float> approximate(SinglePrecision p, Context& context, Preferences::AngleUnit angleUnit) const override {

View File

@@ -22,8 +22,8 @@ public:
// Properties
Type type() const override { return Type::Multiplication; }
Sign sign() const override;
int polynomialDegree(Context & context, char symbolName) const override;
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
// Approximation
template<typename T> static Complex<T> compute(const std::complex<T> c, const std::complex<T> d) { return Complex<T>(c*d); }
@@ -83,7 +83,7 @@ public:
Expression setSign(ExpressionNode::Sign s, Context & context, Preferences::AngleUnit angleUnit);
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit);
Expression shallowBeautify(Context & context, Preferences::AngleUnit angleUnit);
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
Expression denominator(Context & context, Preferences::AngleUnit angleUnit) const;
private:
// Simplification

View File

@@ -24,7 +24,7 @@ public:
// Properties
Type type() const override { return Type::Opposite; }
int polynomialDegree(Context & context, char symbolName) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
Sign sign() const override;
// Approximation

View File

@@ -20,7 +20,7 @@ public:
// Properties
Type type() const override { return Type::Parenthesis; }
int polynomialDegree(Context & context, char symbolName) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
// Layout
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;

View File

@@ -27,8 +27,8 @@ public:
Sign sign() const override;
Expression setSign(Sign s, Context & context, Preferences::AngleUnit angleUnit) override;
int polynomialDegree(Context & context, char symbolName) const override;
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
template<typename T> static Complex<T> compute(const std::complex<T> c, const std::complex<T> d);
@@ -70,7 +70,7 @@ public:
Power(Expression base, Expression exponent);
Power(const PowerNode * n) : Expression(n) {}
Expression setSign(ExpressionNode::Sign s, Context & context, Preferences::AngleUnit angleUnit);
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit);
Expression shallowBeautify(Context & context, Preferences::AngleUnit angleUnit);

View File

@@ -23,7 +23,7 @@ public:
// Properties
Type type() const override { return Type::PredictionInterval; }
int polynomialDegree(Context & context, char symbolName) const override { return -1; }
int polynomialDegree(Context & context, const char * symbolName) const override { return -1; }
private:
// Layout
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;

View File

@@ -22,7 +22,7 @@ public:
// ExpressionNode
Type type() const override { return Type::Store; }
int polynomialDegree(Context & context, char symbolName) const override { return -1; }
int polynomialDegree(Context & context, const char * symbolName) const override { return -1; }
private:
// Simplification

View File

@@ -23,7 +23,7 @@ public:
// Properties
Type type() const override { return Type::Subtraction; }
int polynomialDegree(Context & context, char symbolName) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
// Approximation
template<typename T> static Complex<T> compute(const std::complex<T> c, const std::complex<T> d) { return Complex<T>(c - d); }

View File

@@ -32,8 +32,8 @@ public:
Type type() const override { return Type::Symbol; }
Sign sign() const override;
Expression replaceSymbolWithExpression(const char * symbol, Expression & expression) override;
int polynomialDegree(Context & context, char symbolName) const override;
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
int getVariables(Context & context, isVariableTest isVariable, char * variables) const override;
float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const override;
@@ -81,7 +81,7 @@ public:
// Expression
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit);
Expression replaceSymbolWithExpression(const char * symbol, Expression & expression);
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
// Symbol
const char * name() const { return node()->name(); }

View File

@@ -18,7 +18,7 @@ public:
// Properties
Type type() const override { return Type::Undefined; }
int polynomialDegree(Context & context, char symbolName) const override;
int polynomialDegree(Context & context, const char * symbolName) const override;
Expression setSign(Sign s, Context & context, Preferences::AngleUnit angleUnit) override;
// Approximation

View File

@@ -9,7 +9,7 @@
namespace Poincare {
int AdditionNode::polynomialDegree(Context & context, char symbolName) const {
int AdditionNode::polynomialDegree(Context & context, const char * symbolName) const {
int degree = 0;
for (ExpressionNode * e : children()) {
int d = e->polynomialDegree(context, symbolName);
@@ -21,7 +21,7 @@ int AdditionNode::polynomialDegree(Context & context, char symbolName) const {
return degree;
}
int AdditionNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int AdditionNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
return Addition(this).getPolynomialCoefficients(context, symbolName, coefficients);
}
@@ -60,7 +60,7 @@ const Number Addition::NumeralFactor(const Expression & e) {
return Rational(1);
}
int Addition::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int Addition::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
int deg = polynomialDegree(context, symbolName);
if (deg < 0 || deg > Expression::k_maxPolynomialDegree) {
return -1;

View File

@@ -8,7 +8,7 @@
namespace Poincare {
int DerivativeNode::polynomialDegree(Context & context, char symbolName) const {
int DerivativeNode::polynomialDegree(Context & context, const char * symbolName) const {
if (childAtIndex(0)->polynomialDegree(context, symbolName) == 0
&& childAtIndex(1)->polynomialDegree(context, symbolName) == 0)
{

View File

@@ -11,7 +11,7 @@
namespace Poincare {
int DivisionNode::polynomialDegree(Context & context, char symbolName) const {
int DivisionNode::polynomialDegree(Context & context, const char * symbolName) const {
if (childAtIndex(1)->polynomialDegree(context, symbolName) != 0) {
return -1;
}

View File

@@ -105,7 +105,8 @@ bool Expression::getLinearCoefficients(char * variables, Expression coefficients
assert(!recursivelyMatches(IsMatrix, context));
char * x = variables;
while (*x != 0) {
int degree = polynomialDegree(context, *x);
const char symbol[] = {*x, 0};
int degree = polynomialDegree(context, symbol);
if (degree > 1 || degree < 0) {
return false;
}
@@ -116,7 +117,8 @@ bool Expression::getLinearCoefficients(char * variables, Expression coefficients
int index = 0;
Expression polynomialCoefficients[k_maxNumberOfPolynomialCoefficients];
while (*x != 0) {
int degree = equation.getPolynomialReducedCoefficients(*x, polynomialCoefficients, context, angleUnit);
const char symbol[] = {*x, 0};
int degree = equation.getPolynomialReducedCoefficients(symbol, polynomialCoefficients, context, angleUnit);
switch (degree) {
case 0:
coefficients[index] = Rational(0);
@@ -189,7 +191,7 @@ Expression Expression::defaultReplaceSymbolWithExpression(const char * symbol, E
return *this;
}
int Expression::defaultGetPolynomialCoefficients(Context & context, char symbol, Expression coefficients[]) const {
int Expression::defaultGetPolynomialCoefficients(Context & context, const char * symbol, Expression coefficients[]) const {
int deg = polynomialDegree(context, symbol);
if (deg == 0) {
coefficients[0] = clone();
@@ -198,7 +200,7 @@ int Expression::defaultGetPolynomialCoefficients(Context & context, char symbol,
return -1;
}
int Expression::getPolynomialReducedCoefficients(char symbolName, Expression coefficients[], Context & context, Preferences::AngleUnit angleUnit) const {
int Expression::getPolynomialReducedCoefficients(const char * symbolName, Expression coefficients[], Context & context, Preferences::AngleUnit angleUnit) const {
int degree = getPolynomialCoefficients(context, symbolName, coefficients);
for (int i = 0; i <= degree; i++) {
coefficients[i] = coefficients[i].deepReduce(context, angleUnit);

View File

@@ -13,7 +13,7 @@ Expression ExpressionNode::setSign(Sign s, Context & context, Preferences::Angle
return Expression();
}
int ExpressionNode::polynomialDegree(Context & context, char symbolName) const {
int ExpressionNode::polynomialDegree(Context & context, const char * symbolName) const {
for (ExpressionNode * c : children()) {
if (c->polynomialDegree(context, symbolName) != 0) {
return -1;
@@ -22,7 +22,7 @@ int ExpressionNode::polynomialDegree(Context & context, char symbolName) const {
return 0;
}
int ExpressionNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int ExpressionNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
return Expression(this).defaultGetPolynomialCoefficients(context, symbolName, coefficients);
}

View File

@@ -7,12 +7,12 @@
namespace Poincare {
int FunctionNode::polynomialDegree(Context & context, char symbolName) const {
int FunctionNode::polynomialDegree(Context & context, const char * symbolName) const {
Expression e = context.expressionForSymbol(Function(this));
return e.polynomialDegree(context, symbolName);
}
int FunctionNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int FunctionNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
Expression e = context.expressionForSymbol(Function(this));
return e.getPolynomialCoefficients(context, symbolName, coefficients);
}

View File

@@ -9,7 +9,7 @@
namespace Poincare {
int IntegralNode::polynomialDegree(Context & context, char symbolName) const {
int IntegralNode::polynomialDegree(Context & context, const char * symbolName) const {
if (childAtIndex(0)->polynomialDegree(context, symbolName) == 0
&& childAtIndex(1)->polynomialDegree(context, symbolName) == 0
&& childAtIndex(2)->polynomialDegree(context, symbolName) == 0)

View File

@@ -17,7 +17,7 @@ void MatrixNode::didAddChildAtIndex(int newNumberOfChildren) {
setNumberOfColumns(newNumberOfChildren);
}
int MatrixNode::polynomialDegree(Context & context, char symbolName) const {
int MatrixNode::polynomialDegree(Context & context, const char * symbolName) const {
return -1;
}

View File

@@ -28,7 +28,7 @@ ExpressionNode::Sign MultiplicationNode::sign() const {
return (Sign)sign;
}
int MultiplicationNode::polynomialDegree(Context & context, char symbolName) const {
int MultiplicationNode::polynomialDegree(Context & context, const char * symbolName) const {
int degree = 0;
for (ExpressionNode * c : children()) {
int d = c->polynomialDegree(context, symbolName);
@@ -40,7 +40,7 @@ int MultiplicationNode::polynomialDegree(Context & context, char symbolName) con
return degree;
}
int MultiplicationNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int MultiplicationNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
return Multiplication(this).getPolynomialCoefficients(context, symbolName, coefficients);
}
@@ -195,7 +195,7 @@ Expression Multiplication::shallowBeautify(Context & context, Preferences::Angle
return thisExp;
}
int Multiplication::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int Multiplication::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
int deg = polynomialDegree(context, symbolName);
if (deg < 0 || deg > Expression::k_maxPolynomialDegree) {
return -1;

View File

@@ -13,7 +13,7 @@ extern "C" {
namespace Poincare {
int OppositeNode::polynomialDegree(Context & context, char symbolName) const {
int OppositeNode::polynomialDegree(Context & context, const char * symbolName) const {
return childAtIndex(0)->polynomialDegree(context, symbolName);
}

View File

@@ -3,7 +3,7 @@
namespace Poincare {
int ParenthesisNode::polynomialDegree(Context & context, char symbolName) const {
int ParenthesisNode::polynomialDegree(Context & context, const char * symbolName) const {
return childAtIndex(0)->polynomialDegree(context, symbolName);
}

View File

@@ -48,7 +48,7 @@ Expression PowerNode::setSign(Sign s, Context & context, Preferences::AngleUnit
return Power(this).setSign(s, context, angleUnit);
}
int PowerNode::polynomialDegree(Context & context, char symbolName) const {
int PowerNode::polynomialDegree(Context & context, const char * symbolName) const {
int deg = ExpressionNode::polynomialDegree(context, symbolName);
if (deg == 0) {
return deg;
@@ -72,7 +72,7 @@ int PowerNode::polynomialDegree(Context & context, char symbolName) const {
return -1;
}
int PowerNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int PowerNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
return Power(this).getPolynomialCoefficients(context, symbolName, coefficients);
}
@@ -206,7 +206,7 @@ Expression Power::setSign(ExpressionNode::Sign s, Context & context, Preferences
return result;
}
int Power::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int Power::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
int deg = polynomialDegree(context, symbolName);
if (deg <= 0) {
return Expression::defaultGetPolynomialCoefficients(context, symbolName, coefficients);

View File

@@ -8,7 +8,7 @@
namespace Poincare {
int SubtractionNode::polynomialDegree(Context & context, char symbolName) const {
int SubtractionNode::polynomialDegree(Context & context, const char * symbolName) const {
int degree = 0;
for (ExpressionNode * e : children()) {
int d = e->polynomialDegree(context, symbolName);

View File

@@ -34,14 +34,14 @@ Expression SymbolNode::replaceSymbolWithExpression(const char * symbol, Expressi
return Symbol(this).replaceSymbolWithExpression(symbol, expression);
}
int SymbolNode::polynomialDegree(Context & context, char symbolName) const {
if (m_name == symbolName) {
int SymbolNode::polynomialDegree(Context & context, const char * symbolName) const {
if (strcmp(m_name,symbolName) == 0) {
return 1;
}
return 0;
}
int SymbolNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int SymbolNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
return Symbol(this).getPolynomialCoefficients(context, symbolName, coefficients);
}
@@ -196,7 +196,7 @@ Expression Symbol::replaceSymbolWithExpression(const char * symbol, Expression &
return *this;
}
int Symbol::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
int Symbol::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
if (name() == symbolName) {
coefficients[0] = Rational(0);
coefficients[1] = Rational(1);

View File

@@ -17,7 +17,8 @@ namespace Poincare {
float Trigonometry::characteristicXRange(const Expression & e, Context & context, Preferences::AngleUnit angleUnit) {
assert(e.numberOfChildren() == 1);
int d = e.childAtIndex(0).polynomialDegree(context, SpecialSymbols::UnknownX);
const char x[] = {SpecialSymbols::UnknownX, 0};
int d = e.childAtIndex(0).polynomialDegree(context, x);
if (d < 0 || d > 1) {
// child(0) is not linear so we cannot easily find an interesting range
return e.childAtIndex(0).characteristicXRange(context, angleUnit);

View File

@@ -9,7 +9,7 @@ extern "C" {
namespace Poincare {
int UndefinedNode::polynomialDegree(Context & context, char symbolName) const {
int UndefinedNode::polynomialDegree(Context & context, const char * symbolName) const {
return -1;
}

View File

@@ -79,7 +79,7 @@ void assert_parsed_expression_is(const char * expression, Poincare::Expression r
quiz_assert(e.isIdenticalTo(r));
}
void assert_parsed_expression_polynomial_degree(const char * expression, int degree, char symbolName) {
void assert_parsed_expression_polynomial_degree(const char * expression, int degree, const char * symbolName) {
GlobalContext globalContext;
Expression e = parse_expression(expression);
e = e.simplify(globalContext, Radian);

View File

@@ -19,7 +19,7 @@ void translate_in_ASCII_chars(char * expression);
Poincare::Expression parse_expression(const char * expression);
void assert_parsed_expression_type(const char * expression, Poincare::ExpressionNode::Type type);
void assert_parsed_expression_is(const char * expression, Poincare::Expression r);
void assert_parsed_expression_polynomial_degree(const char * expression, int degree, char symbolName = 'x');
void assert_parsed_expression_polynomial_degree(const char * expression, int degree, const char * symbolName = "x");
template<typename T>
void assert_parsed_expression_evaluates_to(const char * expression, const char * approximation, Poincare::Preferences::AngleUnit angleUnit = Degree, Poincare::Preferences::ComplexFormat complexFormat = Cartesian, int numberOfSignificantDigits = -1);

View File

@@ -104,7 +104,7 @@ QUIZ_CASE(poincare_get_variables) {
assert_parsed_expression_has_variables("x^2+2*y+k!*A+w", "xykw");
}
void assert_parsed_expression_has_polynomial_coefficient(const char * expression, char symbolName, const char ** coefficients, Preferences::AngleUnit angleUnit = Preferences::AngleUnit::Degree) {
void assert_parsed_expression_has_polynomial_coefficient(const char * expression, const char * symbolName, const char ** coefficients, Preferences::AngleUnit angleUnit = Preferences::AngleUnit::Degree) {
GlobalContext globalContext;
Expression e = parse_expression(expression);
quiz_assert(!e.isUninitialized());
@@ -123,12 +123,12 @@ void assert_parsed_expression_has_polynomial_coefficient(const char * expression
QUIZ_CASE(poincare_get_polynomial_coefficients) {
const char * coefficient0[] = {"2", "1", "1", 0};
assert_parsed_expression_has_polynomial_coefficient("x^2+x+2", 'x', coefficient0);
assert_parsed_expression_has_polynomial_coefficient("x^2+x+2", "x", coefficient0);
const char * coefficient1[] = {"12+(-6)*P", "12", "3", 0}; //3*x^2+12*x-6*π+12
assert_parsed_expression_has_polynomial_coefficient("3*(x+2)^2-6*P", 'x', coefficient1);
assert_parsed_expression_has_polynomial_coefficient("3*(x+2)^2-6*P", "x", coefficient1);
// TODO: decomment when enable 3-degree polynomes
//const char * coefficient2[] = {"2+32*x", "2", "6", "2", 0}; //2*n^3+6*n^2+2*n+2+32*x
//assert_parsed_expression_has_polynomial_coefficient("2*(n+1)^3-4n+32*x", 'n', coefficient2);
//assert_parsed_expression_has_polynomial_coefficient("2*(n+1)^3-4n+32*x", "n", coefficient2);
const char * coefficient3[] = {"1", "-P", "1", 0}; //x^2-Pi*x+1
assert_parsed_expression_has_polynomial_coefficient("x^2-P*x+1", 'x', coefficient3);
assert_parsed_expression_has_polynomial_coefficient("x^2-P*x+1", "x", coefficient3);
}