diff --git a/apps/regression/model/cubic_model.cpp b/apps/regression/model/cubic_model.cpp index e6ad3d17d..00aa6243a 100644 --- a/apps/regression/model/cubic_model.cpp +++ b/apps/regression/model/cubic_model.cpp @@ -1,9 +1,40 @@ #include "cubic_model.h" #include #include +#include "../../poincare/include/poincare_layouts.h" + +using namespace Poincare; namespace Regression { +ExpressionLayout * CubicModel::Layout() { + static ExpressionLayout * layout = nullptr; + if (layout == nullptr) { + const ExpressionLayout * layoutChildren[] = { + new CharLayout('a', 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('b', 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('c', KDText::FontSize::Small), + new CharLayout('X', KDText::FontSize::Small), + new CharLayout('+', KDText::FontSize::Small), + new CharLayout('d', KDText::FontSize::Small), + }; + layout = new HorizontalLayout(layoutChildren, 12, false); + } + return layout; +} + double CubicModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; diff --git a/apps/regression/model/cubic_model.h b/apps/regression/model/cubic_model.h index 81ec3d93e..041b1fc70 100644 --- a/apps/regression/model/cubic_model.h +++ b/apps/regression/model/cubic_model.h @@ -2,12 +2,14 @@ #define REGRESSION_CUBIC_MODEL_H #include "model.h" +#include namespace Regression { class CubicModel : public Model { public: using Model::Model; + static Poincare::ExpressionLayout * Layout(); double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; double numberOfCoefficients() const override { return 4; } diff --git a/apps/regression/model/exponential_model.cpp b/apps/regression/model/exponential_model.cpp index 23a346e76..f059d1b8d 100644 --- a/apps/regression/model/exponential_model.cpp +++ b/apps/regression/model/exponential_model.cpp @@ -1,9 +1,31 @@ #include "exponential_model.h" #include #include +#include "../../poincare/include/poincare_layouts.h" + +using namespace Poincare; namespace Regression { +ExpressionLayout * ExponentialModel::Layout() { + static ExpressionLayout * layout = nullptr; + if (layout == nullptr) { + const ExpressionLayout * layoutChildren[] = { + new CharLayout('a', KDText::FontSize::Small), + new CharLayout('e', KDText::FontSize::Small), + new VerticalOffsetLayout( + new HorizontalLayout( + new CharLayout('b', KDText::FontSize::Small), + new CharLayout('X', KDText::FontSize::Small), + false), + VerticalOffsetLayout::Type::Superscript, + false) + }; + layout = new HorizontalLayout(layoutChildren, 3, false); + } + return layout; +} + double ExponentialModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; diff --git a/apps/regression/model/exponential_model.h b/apps/regression/model/exponential_model.h index 963c90d65..c277739cd 100644 --- a/apps/regression/model/exponential_model.h +++ b/apps/regression/model/exponential_model.h @@ -2,12 +2,14 @@ #define REGRESSION_EXPONENTIAL_MODEL_H #include "model.h" +#include namespace Regression { class ExponentialModel : public Model { public: using Model::Model; + static Poincare::ExpressionLayout * Layout(); double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; double numberOfCoefficients() const override { return 2; } diff --git a/apps/regression/model/linear_model.cpp b/apps/regression/model/linear_model.cpp index 3c65ed996..1be574f07 100644 --- a/apps/regression/model/linear_model.cpp +++ b/apps/regression/model/linear_model.cpp @@ -1,9 +1,17 @@ #include "linear_model.h" #include +#include #include +using namespace Poincare; + namespace Regression { +ExpressionLayout * LinearModel::Layout() { + static ExpressionLayout * layout = LayoutEngine::createStringLayout("aX+b", 4, KDText::FontSize::Small); + return layout; +} + double LinearModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; diff --git a/apps/regression/model/linear_model.h b/apps/regression/model/linear_model.h index f7ea3bbf3..6b12b1047 100644 --- a/apps/regression/model/linear_model.h +++ b/apps/regression/model/linear_model.h @@ -2,12 +2,14 @@ #define REGRESSION_LINEAR_MODEL_H #include "model.h" +#include namespace Regression { class LinearModel : public Model { public: using Model::Model; + static Poincare::ExpressionLayout * Layout(); double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; double numberOfCoefficients() const override { return 2; } diff --git a/apps/regression/model/logarithmic_model.cpp b/apps/regression/model/logarithmic_model.cpp index f9fae1358..45f44105e 100644 --- a/apps/regression/model/logarithmic_model.cpp +++ b/apps/regression/model/logarithmic_model.cpp @@ -1,9 +1,17 @@ #include "logarithmic_model.h" #include +#include #include +using namespace Poincare; + namespace Regression { +ExpressionLayout * LogarithmicModel::Layout() { + static ExpressionLayout * layout = LayoutEngine::createStringLayout("aln(X)+b", 8, KDText::FontSize::Small); + return layout; +} + double LogarithmicModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; diff --git a/apps/regression/model/logarithmic_model.h b/apps/regression/model/logarithmic_model.h index b7cd8f9de..71b603371 100644 --- a/apps/regression/model/logarithmic_model.h +++ b/apps/regression/model/logarithmic_model.h @@ -2,12 +2,14 @@ #define REGRESSION_LOGARITHMIC_MODEL_H #include "model.h" +#include namespace Regression { class LogarithmicModel : public Model { public: using Model::Model; + static Poincare::ExpressionLayout * Layout(); double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; double numberOfCoefficients() const override { return 2; } diff --git a/apps/regression/model/logistic_model.cpp b/apps/regression/model/logistic_model.cpp index 8bc35a140..9420fe27c 100644 --- a/apps/regression/model/logistic_model.cpp +++ b/apps/regression/model/logistic_model.cpp @@ -1,9 +1,36 @@ #include "logistic_model.h" #include #include +#include "../../poincare/include/poincare_layouts.h" + +using namespace Poincare; namespace Regression { +ExpressionLayout * LogisticModel::Layout() { + static ExpressionLayout * layout = nullptr; + if (layout == nullptr) { + const ExpressionLayout * layoutChildren[] = { + new CharLayout('a', KDText::FontSize::Small), + new CharLayout('+', KDText::FontSize::Small), + new CharLayout('e', KDText::FontSize::Small), + new VerticalOffsetLayout( + new HorizontalLayout( + new CharLayout('-', KDText::FontSize::Small), + new CharLayout('b', KDText::FontSize::Small), + new CharLayout('X', KDText::FontSize::Small), + false), + VerticalOffsetLayout::Type::Superscript, + false) + }; + layout = new FractionLayout( + new CharLayout('c', KDText::FontSize::Small), + new HorizontalLayout(layoutChildren, 4, false), + false); + } + return layout; +} + double LogisticModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; diff --git a/apps/regression/model/logistic_model.h b/apps/regression/model/logistic_model.h index 8c1e9e119..e35084904 100644 --- a/apps/regression/model/logistic_model.h +++ b/apps/regression/model/logistic_model.h @@ -2,12 +2,14 @@ #define REGRESSION_LOGISTIC_MODEL_H #include "model.h" +#include namespace Regression { class LogisticModel : public Model { public: using Model::Model; + static Poincare::ExpressionLayout * Layout(); double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; double numberOfCoefficients() const override { return 3; } diff --git a/apps/regression/model/power_model.cpp b/apps/regression/model/power_model.cpp index e546b2264..fa16e1d0f 100644 --- a/apps/regression/model/power_model.cpp +++ b/apps/regression/model/power_model.cpp @@ -1,9 +1,28 @@ #include "power_model.h" #include #include +#include "../../poincare/include/poincare_layouts.h" + +using namespace Poincare; namespace Regression { +ExpressionLayout * PowerModel::Layout() { + static ExpressionLayout * layout = nullptr; + if (layout == nullptr) { + const ExpressionLayout * layoutChildren[] = { + new CharLayout('a', KDText::FontSize::Small), + new CharLayout('X', KDText::FontSize::Small), + new VerticalOffsetLayout( + new CharLayout('b', KDText::FontSize::Small), + VerticalOffsetLayout::Type::Superscript, + false), + }; + layout = new HorizontalLayout(layoutChildren, 3, false); + } + return layout; +} + double PowerModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; diff --git a/apps/regression/model/power_model.h b/apps/regression/model/power_model.h index 0dcdc8565..81835ddf8 100644 --- a/apps/regression/model/power_model.h +++ b/apps/regression/model/power_model.h @@ -2,12 +2,14 @@ #define REGRESSION_POWER_MODEL_H #include "model.h" +#include namespace Regression { class PowerModel : public Model { public: using Model::Model; + static Poincare::ExpressionLayout * Layout(); double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; double numberOfCoefficients() const override { return 2; } diff --git a/apps/regression/model/quadratic_model.cpp b/apps/regression/model/quadratic_model.cpp index d0da368e8..2048cff59 100644 --- a/apps/regression/model/quadratic_model.cpp +++ b/apps/regression/model/quadratic_model.cpp @@ -1,9 +1,33 @@ #include "quadratic_model.h" #include #include +#include "../../poincare/include/poincare_layouts.h" + +using namespace Poincare; namespace Regression { +ExpressionLayout * QuadraticModel::Layout() { + static ExpressionLayout * layout = nullptr; + if (layout == nullptr) { + const ExpressionLayout * layoutChildren[] = { + new CharLayout('a', 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('b', KDText::FontSize::Small), + new CharLayout('X', KDText::FontSize::Small), + new CharLayout('+', KDText::FontSize::Small), + new CharLayout('c', KDText::FontSize::Small), + }; + layout = new HorizontalLayout(layoutChildren, 8, false); + } + return layout; +} + double QuadraticModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; diff --git a/apps/regression/model/quadratic_model.h b/apps/regression/model/quadratic_model.h index 6175b88ad..9035c4ed1 100644 --- a/apps/regression/model/quadratic_model.h +++ b/apps/regression/model/quadratic_model.h @@ -2,12 +2,14 @@ #define REGRESSION_QUADRATIC_MODEL_H #include "model.h" +#include namespace Regression { class QuadraticModel : public Model { public: using Model::Model; + static Poincare::ExpressionLayout * Layout(); double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; double numberOfCoefficients() const override { return 3; } diff --git a/apps/regression/model/quartic_model.cpp b/apps/regression/model/quartic_model.cpp index bf109f823..6e0060052 100644 --- a/apps/regression/model/quartic_model.cpp +++ b/apps/regression/model/quartic_model.cpp @@ -1,9 +1,47 @@ #include "quartic_model.h" #include #include +#include "../../poincare/include/poincare_layouts.h" + +using namespace Poincare; namespace Regression { +ExpressionLayout * QuarticModel::Layout() { + static ExpressionLayout * layout = nullptr; + if (layout == nullptr) { + const ExpressionLayout * layoutChildren[] = { + new CharLayout('a', 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('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('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('X', KDText::FontSize::Small), + new CharLayout('+', KDText::FontSize::Small), + new CharLayout('e', KDText::FontSize::Small), + }; + layout = new HorizontalLayout(layoutChildren, 16, false); + } + return layout; +} + double QuarticModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; diff --git a/apps/regression/model/quartic_model.h b/apps/regression/model/quartic_model.h index a54c63e18..0dcc453b5 100644 --- a/apps/regression/model/quartic_model.h +++ b/apps/regression/model/quartic_model.h @@ -2,12 +2,14 @@ #define REGRESSION_QUARTIC_MODEL_H #include "model.h" +#include namespace Regression { class QuarticModel : public Model { public: using Model::Model; + static Poincare::ExpressionLayout * Layout(); double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; double numberOfCoefficients() const override { return 5; } diff --git a/apps/regression/model/trigonometric_model.cpp b/apps/regression/model/trigonometric_model.cpp index 6380ddb9b..174e5833e 100644 --- a/apps/regression/model/trigonometric_model.cpp +++ b/apps/regression/model/trigonometric_model.cpp @@ -1,10 +1,18 @@ #include "trigonometric_model.h" #include #include +#include #include +using namespace Poincare; + namespace Regression { +ExpressionLayout * TrigonometricModel::Layout() { + static ExpressionLayout * layout = LayoutEngine::createStringLayout("asin(bX+c)", 10, KDText::FontSize::Small); + return layout; +} + double TrigonometricModel::evaluate(double * modelCoefficients, double x) const { double a = modelCoefficients[0]; double b = modelCoefficients[1]; diff --git a/apps/regression/model/trigonometric_model.h b/apps/regression/model/trigonometric_model.h index 6d47f7fe4..4724298b3 100644 --- a/apps/regression/model/trigonometric_model.h +++ b/apps/regression/model/trigonometric_model.h @@ -2,12 +2,14 @@ #define REGRESSION_TRIGONOMETRIC_MODEL_H #include "model.h" +#include namespace Regression { class TrigonometricModel : public Model { public: using Model::Model; + static Poincare::ExpressionLayout * Layout(); double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; double numberOfCoefficients() const override { return 3; } diff --git a/apps/regression/regression_controller.cpp b/apps/regression/regression_controller.cpp index 1ef628bf2..a73ed1b99 100644 --- a/apps/regression/regression_controller.cpp +++ b/apps/regression/regression_controller.cpp @@ -1,4 +1,13 @@ #include "regression_controller.h" +#include "model/cubic_model.h" +#include "model/exponential_model.h" +#include "model/linear_model.h" +#include "model/logarithmic_model.h" +#include "model/logistic_model.h" +#include "model/power_model.h" +#include "model/quadratic_model.h" +#include "model/quartic_model.h" +#include "model/trigonometric_model.h" #include using namespace Poincare; @@ -13,27 +22,6 @@ RegressionController::RegressionController(Responder * parentResponder, Store * m_store(store), m_series(-1) { - /*// aX+b - m_regressionLayouts[0] = LayoutEngine::createStringLayout("aX+b"); - // aX^2+bX+c - const ExpressionLayout * const * quadraticLayoutOperands[] = { - - }; - m_regressionLayouts[1] - // aX^3+bX^2+cX+d - //TODO - // aX^4+bX^3+cX^2+dX+e - //TODO - // aln(X)+b - m_regressionLayouts[4] = LayoutEngine::createStringLayout("aln(X)+b"); - // ae^(bX) - //TODO - //aX^b - //TODO - // asin(bX+c) - m_regressionLayouts[7] = LayoutEngine::createStringLayout("asin(bX+c)"); - // c/(1+ae^(-bX) - //TODO*/ } const char * RegressionController::title() { @@ -68,6 +56,39 @@ void RegressionController::willDisplayCellAtLocation(HighlightCell * cell, int i I18n::Message messages[k_numberOfRows] = {I18n::Message::Linear, I18n::Message::Quadratic, I18n::Message::Cubic, I18n::Message::Quartic, I18n::Message::Logarithmic, I18n::Message::Exponential, I18n::Message::Power, I18n::Message::Trigonometric, I18n::Message::Logistic}; MessageTableCellWithExpression * castedCell = static_cast(cell); castedCell->setMessage(messages[j]); + switch ((Model::Type) j) { + // TODO virtualize ? + case Model::Type::Linear: + castedCell->setExpressionLayout(LinearModel::Layout()); + break; + case Model::Type::Quadratic: + castedCell->setExpressionLayout(QuadraticModel::Layout()); + break; + case Model::Type::Cubic: + castedCell->setExpressionLayout(CubicModel::Layout()); + break; + case Model::Type::Quartic: + castedCell->setExpressionLayout(QuarticModel::Layout()); + break; + case Model::Type::Logarithmic: + castedCell->setExpressionLayout(LogarithmicModel::Layout()); + break; + case Model::Type::Exponential: + castedCell->setExpressionLayout(ExponentialModel::Layout()); + break; + case Model::Type::Power: + castedCell->setExpressionLayout(PowerModel::Layout()); + break; + case Model::Type::Trigonometric: + castedCell->setExpressionLayout(TrigonometricModel::Layout()); + break; + case Model::Type::Logistic: + castedCell->setExpressionLayout(LogisticModel::Layout()); + break; + default: + assert(false); + break; + } } } diff --git a/escher/include/escher/message_table_cell_with_expression.h b/escher/include/escher/message_table_cell_with_expression.h index 4d6c8c8c5..5ca4795d9 100644 --- a/escher/include/escher/message_table_cell_with_expression.h +++ b/escher/include/escher/message_table_cell_with_expression.h @@ -7,7 +7,7 @@ class MessageTableCellWithExpression : public MessageTableCell { public: MessageTableCellWithExpression(I18n::Message message = (I18n::Message)0, KDText::FontSize size = KDText::FontSize::Small); - View * subAccessoryView() const override; + View * accessoryView() const override; void setHighlighted(bool highlight) override; void setExpressionLayout(Poincare::ExpressionLayout * expressionLayout); private: diff --git a/escher/src/message_table_cell_with_expression.cpp b/escher/src/message_table_cell_with_expression.cpp index c75202473..999e0398d 100644 --- a/escher/src/message_table_cell_with_expression.cpp +++ b/escher/src/message_table_cell_with_expression.cpp @@ -7,7 +7,7 @@ MessageTableCellWithExpression::MessageTableCellWithExpression(I18n::Message mes { } -View * MessageTableCellWithExpression::subAccessoryView() const { +View * MessageTableCellWithExpression::accessoryView() const { return (View *)&m_subtitleView; }