#include "cubic_model.h" #include "../../shared/poincare_helpers.h" #include #include #include #include #include #include #include #include #include #include #include using namespace Poincare; using namespace Shared; namespace Regression { Layout CubicModel::layout() { if (m_layout.isUninitialized()) { constexpr int size = 15; Layout layoutChildren[size] = { CodePointLayout::Builder('a', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), VerticalOffsetLayout::Builder( CodePointLayout::Builder('3', k_layoutFont), VerticalOffsetLayoutNode::Position::Superscript ), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('b', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), VerticalOffsetLayout::Builder( CodePointLayout::Builder('2', k_layoutFont), VerticalOffsetLayoutNode::Position::Superscript ), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('c', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('d', k_layoutFont), }; m_layout = HorizontalLayout::Builder(layoutChildren, size); } return m_layout; } double CubicModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; double c = modelCoefficients[2]; double d = modelCoefficients[3]; return a*x*x*x+b*x*x+c*x+d; } double CubicModel::partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const { if (derivateCoefficientIndex == 0) { // Derivate: x^3 return x*x*x; } if (derivateCoefficientIndex == 1) { // Derivate: x^2 return x*x; } if (derivateCoefficientIndex == 2) { // Derivate: x return x; } if (derivateCoefficientIndex == 3) { // Derivate: 1 return 1; } assert(false); return 0.0; } Expression CubicModel::expression(double * modelCoefficients) { double a = modelCoefficients[0]; double b = modelCoefficients[1]; double c = modelCoefficients[2]; double d = modelCoefficients[3]; Expression addChildren[] = { Multiplication::Builder( Number::DecimalNumber(a), Power::Builder( Symbol::Builder('x'), Decimal::Builder(3.0))), Multiplication::Builder( Number::DecimalNumber(b), Power::Builder( Symbol::Builder('x'), Decimal::Builder(2.0))), Multiplication::Builder( Number::DecimalNumber(c), Symbol::Builder('x')), Number::DecimalNumber(d) }; // a*x^3+b*x^2+c*x+d Expression result = Addition::Builder(addChildren, 4); return result; } }