#include "quartic_model.h" #include "../../shared/poincare_helpers.h" #include #include #include "../../poincare/include/poincare_layouts.h" using namespace Poincare; using namespace Shared; namespace Regression { ExpressionLayout * QuarticModel::layout() { static ExpressionLayout * layout = nullptr; if (layout == nullptr) { const ExpressionLayout * layoutChildren[] = { new CharLayout('a', KDText::FontSize::Small), new CharLayout(Ion::Charset::MiddleDot, KDText::FontSize::Small), new CharLayout('X', KDText::FontSize::Small), new VerticalOffsetLayout( new CharLayout('4', KDText::FontSize::Small), VerticalOffsetLayout::Type::Superscript, false), new CharLayout('+', KDText::FontSize::Small), new CharLayout('b', KDText::FontSize::Small), new CharLayout(Ion::Charset::MiddleDot, KDText::FontSize::Small), new CharLayout('X', KDText::FontSize::Small), new VerticalOffsetLayout( new CharLayout('3', KDText::FontSize::Small), VerticalOffsetLayout::Type::Superscript, false), new CharLayout('+', KDText::FontSize::Small), new CharLayout('c', KDText::FontSize::Small), new CharLayout(Ion::Charset::MiddleDot, KDText::FontSize::Small), new CharLayout('X', KDText::FontSize::Small), new VerticalOffsetLayout( new CharLayout('2', KDText::FontSize::Small), VerticalOffsetLayout::Type::Superscript, false), new CharLayout('+', KDText::FontSize::Small), new CharLayout('d', KDText::FontSize::Small), new CharLayout(Ion::Charset::MiddleDot, KDText::FontSize::Small), new CharLayout('X', KDText::FontSize::Small), new CharLayout('+', KDText::FontSize::Small), new CharLayout('e', KDText::FontSize::Small), }; layout = new HorizontalLayout(layoutChildren, 20, false); } return layout; } Expression * QuarticModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { double a = modelCoefficients[0]; double b = modelCoefficients[1]; double c = modelCoefficients[2]; double d = modelCoefficients[3]; double e = modelCoefficients[4]; Expression * ax4Expression = new Multiplication( new Decimal(a), new Power( new Symbol('x'), new Decimal(4.0), false), false); Expression * bx3Expression = new Multiplication( new Decimal(b), new Power( new Symbol('x'), new Decimal(3.0), false), false); Expression * cx2Expression = new Multiplication( new Decimal(c), new Power( new Symbol('x'), new Decimal(2.0), false), false); Expression * dxExpression = new Multiplication( new Decimal(d), new Symbol('x'), false); Expression * eExpression = new Decimal(e); Expression * const operands[] = {ax4Expression, bx3Expression, cx2Expression, dxExpression, eExpression}; Expression * result = new Addition(operands, 5, false); PoincareHelpers::Simplify(&result, *context); return result; } double QuarticModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; double c = modelCoefficients[2]; double d = modelCoefficients[3]; double e = modelCoefficients[4]; return a*x*x*x*x+b*x*x*x+c*x*x+d*x+e; } double QuarticModel::partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const { if (derivateCoefficientIndex == 0) { // Derivate: x^4 return x*x*x*x; } if (derivateCoefficientIndex == 1) { // Derivate: x^3 return x*x*x; } if (derivateCoefficientIndex == 2) { // Derivate: x^2 return x*x; } if (derivateCoefficientIndex == 3) { // Derivate: x return x; } if (derivateCoefficientIndex == 4) { // Derivate: 1 return 1; } assert(false); return 0.0; } }