Files
Upsilon/apps/regression/store.h
Émilie Feral 48f890ef93 [poincare] AngleUnit, FormatComplex and PrintFloatMode are now
enumeration of Preferences class
2018-07-30 13:48:04 +02:00

85 lines
3.3 KiB
C++

#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"
#include <escher/responder.h>
#include <float.h>
namespace Regression {
class Store : public Shared::InteractiveCurveViewRange, public Shared::DoublePairStore {
public:
Store();
~Store();
Store(const Store & other) = delete;
Store(Store && other) = delete;
Store& operator=(const Store & other) = delete;
Store& operator=(Store && other) = delete;
// Regression
void setSeriesRegressionType(int series, Model::Type type);
Model::Type seriesRegressionType(int series) {
return m_regressionTypes[series];
}
Model * modelForSeries(int series) {
assert(series >= 0 && series < k_numberOfSeries);
assert((int)m_regressionTypes[series] >= 0 && (int)m_regressionTypes[series] < Model::k_numberOfModels);
return m_regressionModels[(int)m_regressionTypes[series]];
}
/* Return the series index of the closest regression at abscissa x, above
* ordinate y if direction > 0, below otherwise */
int closestVerticalRegression(int direction, double x, double y, int currentRegressionSeries, Poincare::Context * globalContext);
// Dots
/* Return the closest dot to abscissa x above the regression curve if
* direction > 0, below otherwise */
int closestVerticalDot(int direction, double x, double y, int currentSeries, int currentDot, int * nextSeries, Poincare::Context * globalContext);
/* Return the closest dot to given dot, on the right if direction > 0,
* on the left otherwise */
int nextDot(int series, int direction, int dot);
Model * regressionModel(Model::Type type) {
return m_regressionModels[(int) type];
}
// Window
void setDefault() override;
// Series
bool seriesIsEmpty(int series) const override;
// Calculation
double * coefficientsForSeries(int series, Poincare::Context * globalContext);
double doubleCastedNumberOfPairsOfSeries(int series) const;
double squaredValueSumOfColumn(int series, int i) const;
double columnProductSum(int series) const;
double meanOfColumn(int series, int i) const;
double varianceOfColumn(int series, int i) const;
double standardDeviationOfColumn(int series, int i) const;
double covariance(int series) const;
double slope(int series) const;
double yIntercept(int series) const;
double yValueForXValue(int series, double x, Poincare::Context * globalContext);
double xValueForYValue(int series, double y, Poincare::Context * globalContext);
double correlationCoefficient(int series) const;
double squaredCorrelationCoefficient(int series) const;
private:
constexpr static float k_displayHorizontalMarginRatio = 0.05f;
float maxValueOfColumn(int series, int i) const;
float minValueOfColumn(int series, int i) const;
uint32_t m_seriesChecksum[k_numberOfSeries];
Model::Type m_regressionTypes[k_numberOfSeries];
Model * m_regressionModels[Model::k_numberOfModels];
double m_regressionCoefficients[k_numberOfSeries][Model::k_maxNumberOfCoefficients];
bool m_regressionChanged[k_numberOfSeries];
Poincare::Preferences::AngleUnit m_angleUnit;
};
typedef double (Store::*ArgCalculPointer)(int, int) const;
typedef double (Store::*CalculPointer)(int) const;
typedef void (Store::*RangeMethodPointer)();
}
#endif