[apps/regression] Display the regression type menu

This commit is contained in:
Léa Saviot
2018-06-06 14:01:59 +02:00
committed by Émilie Feral
parent 5b6909ea5e
commit 6ca4ecb635
16 changed files with 227 additions and 4 deletions

View File

@@ -15,6 +15,7 @@ app_objs += $(addprefix apps/regression/,\
levenberg_marquardt.o\
prediction_parameter_controller.o\
regression_context.o\
regression_controller.o\
store.o\
store_controller.o\
store_parameter_controller.o\

View File

@@ -11,3 +11,13 @@ ValueNotReachedByRegression = "Wert wird nicht von der Regression erreicht"
NumberOfDots = "Punktanzahl"
Covariance = "Kovarianz"
ChangeRegression = "Change regression"
RegressionChoice = "Regression choice"
Linear = "Linear"
Quadratic = "Quadratic"
Cubic = "Cubic"
Quartic = "Quartic"
Logarithmic = "Logarithmic"
Exponential = "Exponential"
Power = "Power"
Trigonometric = "Trigonometric"
Logistic = "Logistic"

View File

@@ -11,3 +11,13 @@ ValueNotReachedByRegression = "Value not reached by regression"
NumberOfDots = "Number of points"
Covariance = "Covariance"
ChangeRegression = "Change regression"
RegressionChoice = "Regression choice"
Linear = "Linear"
Quadratic = "Quadratic"
Cubic = "Cubic"
Quartic = "Quartic"
Logarithmic = "Logarithmic"
Exponential = "Exponential"
Power = "Power"
Trigonometric = "Trigonometric"
Logistic = "Logistic"

View File

@@ -11,3 +11,13 @@ ValueNotReachedByRegression = "No se alcanza este valor"
NumberOfDots = "Numero de puntos"
Covariance = "Covarianza"
ChangeRegression = "Change regression"
RegressionChoice = "Regression choice"
Linear = "Linear"
Quadratic = "Quadratic"
Cubic = "Cubic"
Quartic = "Quartic"
Logarithmic = "Logarithmic"
Exponential = "Exponential"
Power = "Power"
Trigonometric = "Trigonometric"
Logistic = "Logistic"

View File

@@ -11,3 +11,13 @@ ValueNotReachedByRegression = "Valeur non atteinte par la regression"
NumberOfDots = "Nombre de points"
Covariance = "Covariance"
ChangeRegression = "Change regression"
RegressionChoice = "Regression choice"
Linear = "Linear"
Quadratic = "Quadratic"
Cubic = "Cubic"
Quartic = "Quartic"
Logarithmic = "Logarithmic"
Exponential = "Exponential"
Power = "Power"
Trigonometric = "Trigonometric"
Logistic = "Logistic"

View File

@@ -11,3 +11,13 @@ ValueNotReachedByRegression = "Valor nao alcancado pela regressao"
NumberOfDots = "Numero de pontos"
Covariance = "Covariancia"
ChangeRegression = "Change regression"
RegressionChoice = "Regression choice"
Linear = "Linear"
Quadratic = "Quadratic"
Cubic = "Cubic"
Quartic = "Quartic"
Logarithmic = "Logarithmic"
Exponential = "Exponential"
Power = "Power"
Trigonometric = "Trigonometric"
Logistic = "Logistic"

View File

@@ -0,0 +1,73 @@
#include "regression_controller.h"
#include <assert.h>
using namespace Poincare;
namespace Regression {
RegressionController::RegressionController(Responder * parentResponder, Store * store) :
ViewController(parentResponder),
SimpleListViewDataSource(),
SelectableTableViewDataSource(),
m_selectableTableView(this, this, this),
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() {
return I18n::translate(I18n::Message::RegressionChoice);
}
void RegressionController::didBecomeFirstResponder() {
selectCellAtLocation(0, 0);
app()->setFirstResponder(&m_selectableTableView);
}
bool RegressionController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::OK || event == Ion::Events::EXE) {
assert(m_series > -1);
m_store->setSeriesRegressionType(m_series, (Model::Type)selectedRow());
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
stack->pop();
return true;
}
return false;
}
HighlightCell * RegressionController::reusableCell(int index) {
assert(index >= 0);
assert(index < k_numberOfCells);
return &m_regressionCells[index];
}
void RegressionController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) {
assert(i == 0);
assert(j >= 0 && j < k_numberOfRows);
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<MessageTableCellWithExpression *>(cell);
castedCell->setMessage(messages[j]);
}
}

View File

@@ -0,0 +1,42 @@
#ifndef REGRESSION_REGRESSION_CONTROLLER_H
#define REGRESSION_REGRESSION_CONTROLLER_H
#include "store.h"
#include <escher.h>
#include "../i18n.h"
namespace Regression {
class RegressionController : public ViewController, public SimpleListViewDataSource, public SelectableTableViewDataSource {
public:
RegressionController(Responder * parentResponder, Store * store);
void setSeries(int series) { m_series = series; }
// ViewController
const char * title() override;
View * view() override { return &m_selectableTableView; }
// Responder
bool handleEvent(Ion::Events::Event event) override;
void didBecomeFirstResponder() override;
// SimpleListViewDataSource
KDCoordinate cellHeight() override { return Metric::ParameterCellHeight; }
HighlightCell * reusableCell(int index) override;
int reusableCellCount() override { return k_numberOfCells; }
// TableViewDataSource
int numberOfRows() override { return k_numberOfRows; }
void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override;
private:
constexpr static int k_numberOfRows = 9;
constexpr static int k_numberOfCells = 6; // (240 - 70) / 35
MessageTableCellWithExpression m_regressionCells[k_numberOfCells];
//Poincare::ExpressionLayout * m_regressionLayouts[k_numberOfRows];
SelectableTableView m_selectableTableView;
Store * m_store;
int m_series;
};
}
#endif

View File

@@ -15,6 +15,9 @@ Store::Store() :
InteractiveCurveViewRange(nullptr, this),
DoublePairStore()
{
for (int i = 0; i < k_numberOfSeries; i++) {
m_regressionTypes[i] = Model::Type::Linear;
}
}
/* Regressions */

View File

@@ -1,6 +1,7 @@
#ifndef REGRESSION_STORE_H
#define REGRESSION_STORE_H
#include "model/model.h"
#include "../shared/interactive_curve_view_range.h"
#include "../shared/double_pair_store.h"
extern "C" {
@@ -14,6 +15,10 @@ public:
Store();
// Regression
void setSeriesRegressionType(int series, Model::Type type) {
assert(series >= 0 && series < k_maxNumberOfSeries);
m_regressionTypes[series] = type;
}
/* Return the series index of the closest regression at abscissa x, above
* ordinate y if direction > 0, below otherwise */
int closestVerticalRegression(int direction, float x, float y, int currentRegressionSeries);
@@ -54,6 +59,7 @@ private:
float addMargin(float x, float range, bool isMin) override;
float maxValueOfColumn(int series, int i) const;
float minValueOfColumn(int series, int i) const;
Model::Type m_regressionTypes[k_numberOfSeries];
};
typedef double (Store::*ArgCalculPointer)(int, int) const;

View File

@@ -4,15 +4,17 @@
namespace Regression {
StoreParameterController::StoreParameterController(Responder * parentResponder, Shared::DoublePairStore * store, StoreController * storeController) :
StoreParameterController::StoreParameterController(Responder * parentResponder, Store * store, StoreController * storeController) :
Shared::StoreParameterController(parentResponder, store, storeController),
m_changeRegression(I18n::Message::ChangeRegression)
m_changeRegression(I18n::Message::ChangeRegression),
m_regressionController(this, store)
{
}
bool StoreParameterController::handleEvent(Ion::Events::Event event) {
if ((event == Ion::Events::OK || event == Ion::Events::EXE) && selectedRow() == numberOfRows() - 1) {
//TODO
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
stack->push(&m_regressionController);
return true;
}
return Shared::StoreParameterController::handleEvent(event);

View File

@@ -1,6 +1,8 @@
#ifndef REGRESSION_STORE_PARAMETER_CONTROLLER_H
#define REGRESSION_STORE_PARAMETER_CONTROLLER_H
#include "regression_controller.h"
#include "store.h"
#include "../shared/store_parameter_controller.h"
namespace Regression {
@@ -9,13 +11,14 @@ class StoreController;
class StoreParameterController : public Shared::StoreParameterController {
public:
StoreParameterController(Responder * parentResponder, Shared::DoublePairStore * store, StoreController * storeController);
StoreParameterController(Responder * parentResponder, Store * store, StoreController * storeController);
bool handleEvent(Ion::Events::Event event) override;
int numberOfRows() override { return Shared::StoreParameterController::numberOfRows() + 1; }
HighlightCell * reusableCell(int index) override;
int reusableCellCount() override { return Shared::StoreParameterController::reusableCellCount() + 1; }
private:
MessageTableCell m_changeRegression;
RegressionController m_regressionController;
};
}

View File

@@ -36,6 +36,7 @@ objs += $(addprefix escher/src/,\
message_table_cell_with_chevron_and_message.o\
message_table_cell_with_chevron_and_expression.o\
message_table_cell_with_editable_text.o\
message_table_cell_with_expression.o\
message_table_cell_with_gauge.o\
message_table_cell_with_message.o\
message_table_cell_with_switch.o\

View File

@@ -39,6 +39,7 @@
#include <escher/message_table_cell_with_chevron_and_message.h>
#include <escher/message_table_cell_with_chevron_and_expression.h>
#include <escher/message_table_cell_with_editable_text.h>
#include <escher/message_table_cell_with_expression.h>
#include <escher/message_table_cell_with_gauge.h>
#include <escher/message_table_cell_with_message.h>
#include <escher/message_table_cell_with_switch.h>

View File

@@ -0,0 +1,17 @@
#ifndef ESCHER_MESSAGE_TABLE_CELL_WITH_EXPRESSION_H
#define ESCHER_MESSAGE_TABLE_CELL_WITH_EXPRESSION_H
#include <escher/message_table_cell.h>
#include <escher/expression_view.h>
class MessageTableCellWithExpression : public MessageTableCell {
public:
MessageTableCellWithExpression(I18n::Message message = (I18n::Message)0, KDText::FontSize size = KDText::FontSize::Small);
View * subAccessoryView() const override;
void setHighlighted(bool highlight) override;
void setExpressionLayout(Poincare::ExpressionLayout * expressionLayout);
private:
ExpressionView m_subtitleView;
};
#endif

View File

@@ -0,0 +1,24 @@
#include <escher/message_table_cell_with_expression.h>
#include <escher/palette.h>
MessageTableCellWithExpression::MessageTableCellWithExpression(I18n::Message message, KDText::FontSize size) :
MessageTableCell(message, size),
m_subtitleView(1.0f, 0.5f, Palette::GreyDark)
{
}
View * MessageTableCellWithExpression::subAccessoryView() const {
return (View *)&m_subtitleView;
}
void MessageTableCellWithExpression::setHighlighted(bool highlight) {
MessageTableCell::setHighlighted(highlight);
KDColor backgroundColor = isHighlighted()? Palette::Select : KDColorWhite;
m_subtitleView.setBackgroundColor(backgroundColor);
}
void MessageTableCellWithExpression::setExpressionLayout(Poincare::ExpressionLayout * expressionLayout) {
m_subtitleView.setExpressionLayout(expressionLayout);
reloadCell();
layoutSubviews();
}