mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-19 05:40:38 +01:00
[apps/reg] Fix x prediction given y
The expressions need to be simplified before computing intersections
This commit is contained in:
@@ -38,7 +38,7 @@ ExpressionLayout * CubicModel::layout() {
|
||||
return layout;
|
||||
}
|
||||
|
||||
Expression * CubicModel::expression(double * modelCoefficients) {
|
||||
Expression * CubicModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) {
|
||||
if (m_expression != nullptr) {
|
||||
delete m_expression;
|
||||
m_expression = nullptr;
|
||||
@@ -68,6 +68,7 @@ Expression * CubicModel::expression(double * modelCoefficients) {
|
||||
Expression * dExpression = new Decimal(d);
|
||||
Expression * const operands[] = {ax3Expression, bx2Expression, cxExpression, dExpression};
|
||||
m_expression = new Addition(operands, 4, false);
|
||||
Expression::Simplify(&m_expression, *context);
|
||||
return m_expression;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ class CubicModel : public Model {
|
||||
public:
|
||||
CubicModel() : m_expression(nullptr) {}
|
||||
Poincare::ExpressionLayout * layout() override;
|
||||
Poincare::Expression * expression(double * modelCoefficients) override;
|
||||
Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) override;
|
||||
I18n::Message formulaMessage() const override { return I18n::Message::CubicRegressionFormula; }
|
||||
double evaluate(double * modelCoefficients, double x) const override;
|
||||
double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override;
|
||||
|
||||
@@ -12,8 +12,10 @@ using namespace Shared;
|
||||
namespace Regression {
|
||||
|
||||
double Model::levelSet(double * modelCoefficients, double xMin, double step, double xMax, double y, Poincare::Context * context) {
|
||||
Decimal * yExpression = new Decimal(y);
|
||||
double result = expression(modelCoefficients)->nextIntersection('x', xMin, step, xMax, *context, yExpression).abscissa;
|
||||
Expression * yExpression = static_cast<Expression *>(new Decimal(y));
|
||||
Expression::Simplify(&yExpression, *context);
|
||||
Expression * modelExpression = simplifiedExpression(modelCoefficients, context);
|
||||
double result = modelExpression->nextIntersection('x', xMin, step, xMax, *context, yExpression).abscissa;
|
||||
delete yExpression;
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ public:
|
||||
static constexpr int k_maxNumberOfCoefficients = 5;
|
||||
virtual ~Model() = default;
|
||||
virtual Poincare::ExpressionLayout * layout() = 0;
|
||||
virtual Poincare::Expression * expression(double * modelCoefficients) { return nullptr; } //TODO keep this so no need to implement for bijective functions?
|
||||
virtual Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { return nullptr; } //TODO keep this so no need to implement for bijective functions?
|
||||
virtual I18n::Message formulaMessage() const = 0;
|
||||
virtual double evaluate(double * modelCoefficients, double x) const = 0;
|
||||
virtual double levelSet(double * modelCoefficients, double xMin, double step, double xMax, double y, Poincare::Context * context);
|
||||
|
||||
@@ -30,7 +30,7 @@ ExpressionLayout * QuadraticModel::layout() {
|
||||
return layout;
|
||||
}
|
||||
|
||||
Expression * QuadraticModel::expression(double * modelCoefficients) {
|
||||
Expression * QuadraticModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) {
|
||||
if (m_expression != nullptr) {
|
||||
delete m_expression;
|
||||
m_expression = nullptr;
|
||||
@@ -52,6 +52,7 @@ Expression * QuadraticModel::expression(double * modelCoefficients) {
|
||||
Expression * cExpression = new Decimal(c);
|
||||
Expression * const operands[] = {ax2Expression, bxExpression, cExpression};
|
||||
m_expression = new Addition(operands, 3, false);
|
||||
Expression::Simplify(&m_expression, *context);
|
||||
return m_expression;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ class QuadraticModel : public Model {
|
||||
public:
|
||||
QuadraticModel() : m_expression(nullptr) {}
|
||||
Poincare::ExpressionLayout * layout() override;
|
||||
Poincare::Expression * expression(double * modelCoefficients) override;
|
||||
Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) override;
|
||||
I18n::Message formulaMessage() const override { return I18n::Message::QuadraticRegressionFormula; }
|
||||
double evaluate(double * modelCoefficients, double x) const override;
|
||||
double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override;
|
||||
|
||||
@@ -46,7 +46,7 @@ ExpressionLayout * QuarticModel::layout() {
|
||||
return layout;
|
||||
}
|
||||
|
||||
Expression * QuarticModel::expression(double * modelCoefficients) {
|
||||
Expression * QuarticModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) {
|
||||
if (m_expression != nullptr) {
|
||||
delete m_expression;
|
||||
m_expression = nullptr;
|
||||
@@ -84,6 +84,7 @@ Expression * QuarticModel::expression(double * modelCoefficients) {
|
||||
Expression * eExpression = new Decimal(e);
|
||||
Expression * const operands[] = {ax4Expression, bx3Expression, cx2Expression, dxExpression, eExpression};
|
||||
m_expression = new Addition(operands, 5, false);
|
||||
Expression::Simplify(&m_expression, *context);
|
||||
return m_expression;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ class QuarticModel : public Model {
|
||||
public:
|
||||
QuarticModel() : m_expression(nullptr) {}
|
||||
Poincare::ExpressionLayout * layout() override;
|
||||
Poincare::Expression * expression(double * modelCoefficients) override;
|
||||
Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) override;
|
||||
I18n::Message formulaMessage() const override { return I18n::Message::QuarticRegressionFormula; }
|
||||
double evaluate(double * modelCoefficients, double x) const override;
|
||||
double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override;
|
||||
|
||||
@@ -30,7 +30,7 @@ ExpressionLayout * TrigonometricModel::layout() {
|
||||
return layout;
|
||||
}
|
||||
|
||||
Expression * TrigonometricModel::expression(double * modelCoefficients) {
|
||||
Expression * TrigonometricModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) {
|
||||
if (m_expression != nullptr) {
|
||||
delete m_expression;
|
||||
m_expression = nullptr;
|
||||
@@ -49,6 +49,7 @@ Expression * TrigonometricModel::expression(double * modelCoefficients) {
|
||||
false),
|
||||
false);
|
||||
m_expression = new Multiplication(aExpression, sinExpression, false);
|
||||
Expression::Simplify(&m_expression, *context);
|
||||
return m_expression;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ class TrigonometricModel : public Model {
|
||||
public:
|
||||
TrigonometricModel() : m_expression(nullptr) {}
|
||||
Poincare::ExpressionLayout * layout() override;
|
||||
Poincare::Expression * expression(double * modelCoefficients) override;
|
||||
Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) override;
|
||||
I18n::Message formulaMessage() const override { return I18n::Message::TrigonometricRegressionFormula; }
|
||||
double evaluate(double * modelCoefficients, double x) const override;
|
||||
double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override;
|
||||
|
||||
Reference in New Issue
Block a user