1 #ifndef GO_UTILS_REGRESSION_H 2 #define GO_UTILS_REGRESSION_H 3 4 #include <glib.h> 5 #include <glib-object.h> 6 7 G_BEGIN_DECLS 8 9 typedef enum { 10 GO_REG_ok, 11 GO_REG_invalid_dimensions, 12 GO_REG_invalid_data, 13 GO_REG_not_enough_data, 14 GO_REG_near_singular_good, /* Probably good result */ 15 GO_REG_near_singular_bad, /* Probably bad result */ 16 GO_REG_singular 17 } GORegressionResult; 18 19 typedef struct { 20 double *se; /* SE for each parameter estimator */ 21 double *t; /* t values for each parameter estimator */ 22 double sqr_r; 23 double adj_sqr_r; 24 double se_y; /* The Standard Error of Y */ 25 double F; 26 int df_reg; 27 int df_resid; 28 int df_total; 29 double ss_reg; 30 double ss_resid; 31 double ss_total; 32 double ms_reg; 33 double ms_resid; 34 double ybar; 35 double *xbar; 36 double var; /* The variance of the entire regression: sum(errors^2)/(n-xdim) */ 37 /*<private>*/ 38 unsigned int ref_count; 39 } go_regression_stat_t; 40 #define GORegressionStat go_regression_stat_t 41 42 GType go_regression_stat_get_type (void); 43 go_regression_stat_t *go_regression_stat_new (void); 44 void go_regression_stat_destroy (go_regression_stat_t *stat_); 45 46 GORegressionResult go_linear_regression (double **xss, int dim, 47 const double *ys, int n, 48 gboolean affine, 49 double *res, 50 go_regression_stat_t *stat_); 51 GORegressionResult go_linear_regression_leverage (double **A, double *d, 52 int m, int n); 53 GORegressionResult go_exponential_regression (double **xss, int dim, 54 const double *ys, int n, 55 gboolean affine, 56 double *res, 57 go_regression_stat_t *stat_); 58 GORegressionResult go_exponential_regression_as_log (double **xss, int dim, 59 const double *ys, int n, 60 gboolean affine, 61 double *res, 62 go_regression_stat_t *stat_); 63 GORegressionResult go_power_regression (double **xss, int dim, 64 const double *ys, int n, 65 gboolean affine, 66 double *res, 67 go_regression_stat_t *stat_); 68 GORegressionResult go_logarithmic_regression (double **xss, int dim, 69 const double *ys, int n, 70 gboolean affine, 71 double *res, 72 go_regression_stat_t *stat_); 73 74 /* Final accuracy of c is: width of x-range rounded to the next smaller 75 * (10^integer), the result times GO_LOGFIT_C_ACCURACY. 76 * If you change it, remember to change the help-text for LOGFIT. 77 * FIXME: Is there a way to stringify this macros value for the help-text? */ 78 #define GO_LOGFIT_C_ACCURACY 0.000001 79 80 /* Stepwidth for testing for sign is: width of x-range 81 * times GO_LOGFIT_C_STEP_FACTOR. Value is tested a bit. */ 82 #define GO_LOGFIT_C_STEP_FACTOR 0.05 83 84 /* Width of fitted c-range is: width of x-range 85 * times GO_LOGFIT_C_RANGE_FACTOR. Value is tested a bit. 86 * Point clouds with a local minimum of squared residuals outside the fitted 87 * c-range are very weakly bent. */ 88 #define GO_LOGFIT_C_RANGE_FACTOR 100 89 90 GORegressionResult go_logarithmic_fit (double *xs, 91 const double *ys, int n, 92 double *res); 93 94 typedef GORegressionResult (*GORegressionFunction) (double * x, double * params, double *f); 95 96 GORegressionResult go_non_linear_regression (GORegressionFunction f, 97 double **xvals, 98 double *par, 99 double *yvals, 100 double *sigmas, 101 int x_dim, 102 int p_dim, 103 double *chi, 104 double *errors); 105 106 gboolean go_matrix_invert (double **A, int n); 107 double go_matrix_determinant (double *const *const A, int n); 108 109 void go_matrix_pseudo_inverse (double *const * const A, int m, int n, 110 double threshold, 111 double **B); 112 113 GORegressionResult go_linear_solve (double *const *const A, 114 const double *b, 115 int n, 116 double *res); 117 GORegressionResult go_linear_solve_multiple (double *const *const A, 118 double **B, 119 int n, int bn); 120 121 #ifdef GOFFICE_WITH_LONG_DOUBLE 122 typedef struct { 123 long double *se; /*SE for each parameter estimator*/ 124 long double *t; /*t values for each parameter estimator*/ 125 long double sqr_r; 126 long double adj_sqr_r; 127 long double se_y; /* The Standard Error of Y */ 128 long double F; 129 int df_reg; 130 int df_resid; 131 int df_total; 132 long double ss_reg; 133 long double ss_resid; 134 long double ss_total; 135 long double ms_reg; 136 long double ms_resid; 137 long double ybar; 138 long double *xbar; 139 long double var; /* The variance of the entire regression: 140 sum(errors^2)/(n-xdim) */ 141 /*<private>*/ 142 unsigned int ref_count; 143 } go_regression_stat_tl; 144 #define GORegressionStatl go_regression_stat_tl 145 146 GType go_regression_statl_get_type (void); 147 go_regression_stat_tl *go_regression_stat_newl (void); 148 void go_regression_stat_destroyl (go_regression_stat_tl *stat_); 149 150 GORegressionResult go_linear_regressionl (long double **xss, int dim, 151 const long double *ys, int n, 152 gboolean affine, 153 long double *res, 154 go_regression_stat_tl *stat_); 155 GORegressionResult go_linear_regression_leveragel (long double **A, 156 long double *d, 157 int m, int n); 158 GORegressionResult go_exponential_regressionl (long double **xss, int dim, 159 const long double *ys, int n, 160 gboolean affine, 161 long double *res, 162 go_regression_stat_tl *stat_); 163 GORegressionResult go_exponential_regression_as_logl (long double **xss, int dim, 164 const long double *ys, int n, 165 gboolean affine, 166 long double *res, 167 go_regression_stat_tl *stat_); 168 GORegressionResult go_power_regressionl (long double **xss, int dim, 169 const long double *ys, int n, 170 gboolean affine, 171 long double *res, 172 go_regression_stat_tl *stat_); 173 GORegressionResult go_logarithmic_regressionl(long double **xss, int dim, 174 const long double *ys, int n, 175 gboolean affine, 176 long double *res, 177 go_regression_stat_tl *stat_); 178 GORegressionResult go_logarithmic_fitl (long double *xs, 179 const long double *ys, int n, 180 long double *res); 181 182 typedef GORegressionResult (*GORegressionFunctionl) (long double * x, long double * params, long double *f); 183 184 GORegressionResult go_non_linear_regressionl (GORegressionFunctionl f, 185 long double **xvals, 186 long double *par, 187 long double *yvals, 188 long double *sigmas, 189 int x_dim, 190 int p_dim, 191 long double *chi, 192 long double *errors); 193 194 gboolean go_matrix_invertl (long double **A, int n); 195 long double go_matrix_determinantl (long double *const * const A, int n); 196 197 void go_matrix_pseudo_inversel (long double *const * const A, int m, int n, 198 long double threshold, 199 long double **B); 200 201 GORegressionResult go_linear_solvel (long double *const *const A, 202 const long double *b, 203 int n, 204 long double *res); 205 GORegressionResult go_linear_solve_multiplel (long double *const *const A, 206 long double **B, 207 int n, int bn); 208 209 #endif 210 211 G_END_DECLS 212 213 #endif /* GO_UTILS_REGRESSION_H */ 214