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