1 /*
2  *  gretl -- Gnu Regression, Econometrics and Time-series Library
3  *  Copyright (C) 2001 Allin Cottrell and Riccardo "Jack" Lucchetti
4  *
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  */
19 
20 #ifndef GRETL_MATRIX_H
21 #define GRETL_MATRIX_H
22 
23 #ifdef  __cplusplus
24 extern "C" {
25 #endif
26 
27 #include <stdarg.h>
28 #include <complex.h>
29 
30 /* minimum value of diagonal element of R (as in X = QR) that counts
31    as non-zero for the purpose of determining the rank of X */
32 
33 #define R_DIAG_MIN 1.0e-8
34 
35 typedef enum {
36     GRETL_MOD_NONE = 0,
37     GRETL_MOD_TRANSPOSE,
38     GRETL_MOD_SQUARE,
39     GRETL_MOD_CUMULATE,
40     GRETL_MOD_DECREMENT,
41     GRETL_MOD_CTRANSP
42 } GretlMatrixMod;
43 
44 typedef enum {
45     GRETL_MATRIX_SQUARE = 1,
46     GRETL_MATRIX_LOWER_TRIANGULAR,
47     GRETL_MATRIX_UPPER_TRIANGULAR,
48     GRETL_MATRIX_SYMMETRIC,
49     GRETL_MATRIX_DIAGONAL,
50     GRETL_MATRIX_IDENTITY,
51     GRETL_MATRIX_SCALAR,
52 } GretlMatrixStructure;
53 
54 typedef enum {
55     V_SUM,
56     V_PROD,
57     V_MEAN
58 } GretlVecStat;
59 
60 typedef enum {
61     CONF_NONE = 0,
62     CONF_ELEMENTS,
63     CONF_A_COLVEC,
64     CONF_B_COLVEC,
65     CONF_A_ROWVEC,
66     CONF_B_ROWVEC,
67     CONF_A_SCALAR,
68     CONF_B_SCALAR,
69     CONF_AC_BR,
70     CONF_AR_BC
71 } ConfType;
72 
73 typedef struct gretl_matrix_ gretl_vector;
74 
75 typedef struct matrix_info_ matrix_info;
76 
77 /**
78  * gretl_matrix:
79  * @rows: number of rows in matrix
80  * @cols: number of columns
81  * @val: flat array of double-precision values
82  *
83  * The basic libgretl matrix type; #gretl_vector is an alias
84  * that can be used for matrices with @rows or @cols = 1.
85  */
86 
87 typedef struct gretl_matrix_ {
88     int rows;
89     int cols;
90     double *val;
91     double _Complex *z; /* was "complex" */
92     int is_complex;
93     /*< private >*/
94     matrix_info *info;
95 } gretl_matrix;
96 
97 typedef struct gretl_matrix_block_ gretl_matrix_block;
98 
99 /**
100  * gretl_matrix_get:
101  * @m: matrix.
102  * @i: row.
103  * @j: column.
104  *
105  * Returns: the @i, @j element of @m.
106  */
107 
108 #define gretl_matrix_get(m,i,j) (m->val[(j)*m->rows+(i)])
109 #define gretl_cmatrix_get(m,i,j) (m->z[(j)*m->rows+(i)])
110 
111 /**
112  * gretl_vector_get:
113  * @v: vector.
114  * @i: index.
115  *
116  * Returns: element @i of @v.
117  */
118 
119 #define gretl_vector_get(v,i) (v->val[i])
120 
121 /**
122  * gretl_matrix_set:
123  * @m: matrix.
124  * @i: row.
125  * @j: column.
126  * @x: value to set.
127  *
128  * Sets the @i, @j element of @m to @x.
129  */
130 
131 #define gretl_matrix_set(m,i,j,x) ((m)->val[(j)*(m)->rows+(i)]=x)
132 #define gretl_cmatrix_set(m,i,j,x) ((m)->z[(j)*(m)->rows+(i)]=x)
133 
134 /**
135  * gretl_vector_set:
136  * @v: vector.
137  * @i: index.
138  * @x: value to set.
139  *
140  * Sets element @i of @v to @x.
141  */
142 
143 #define gretl_vector_set(v,i,x) ((v)->val[i]=x)
144 
145 /**
146  * gretl_matrix_cols:
147  * @m: matrix to query.
148  *
149  * Returns: the number of columns in @m.
150  */
151 
152 #define gretl_matrix_cols(m) ((m == NULL)? 0 : m->cols)
153 
154 /**
155  * gretl_matrix_rows:
156  * @m: matrix to query.
157  *
158  * Returns: the number of rows in @m.
159  */
160 
161 #define gretl_matrix_rows(m) ((m == NULL)? 0 : m->rows)
162 
163 /**
164  * gretl_vector_get_length:
165  * @v: vector to examine.
166  *
167  * Returns: the length of vector @v (without regard to whether
168  * it is a row or column vector).
169  */
170 
171 #define gretl_vector_get_length(v) ((v == NULL)? 0 : \
172 				    ((v)->cols == 1)? (v)->rows :	\
173 				    ((v)->rows == 1)? (v)->cols : 0)
174 
175 /**
176  * gretl_vector_alloc:
177  * @i: number of columns.
178  *
179  * Returns: a new #gretl_vector with @i columns.
180  */
181 
182 #define gretl_vector_alloc(i) gretl_matrix_alloc(1,(i))
183 
184 /**
185  * gretl_column_vector_alloc:
186  * @i: number of rows.
187  *
188  * Returns: a new column gretl_vector with @i rows.
189  */
190 
191 #define gretl_column_vector_alloc(i) gretl_matrix_alloc((i),1)
192 
193 /**
194  * gretl_vector_free:
195  * @v: %gretl_vector to free.
196  *
197  * Frees the vector @v and its associated storage.
198  */
199 
200 #define gretl_vector_free(v) gretl_matrix_free(v)
201 
202 /**
203  * gretl_matrix_is_scalar:
204  * @m: matrix to test.
205  *
206  * Returns: 1 if @m is 1 x 1, else 0.
207  */
208 
209 #define gretl_matrix_is_scalar(m) ((m) != NULL && \
210 				   (m)->is_complex == 0 && \
211                                    (m)->rows == 1 && \
212                                    (m)->cols == 1)
213 
214 #define gretl_matrix_is_cscalar(m) ((m) != NULL && \
215 				    (m)->is_complex && \
216                                     (m)->rows == 1 && \
217                                     (m)->cols == 1)
218 
219 #define gretl_is_null_matrix(m) (m == NULL || m->rows == 0 || m->cols == 0)
220 
221 #define gretl_is_complex(m) (m != NULL && m->is_complex == 1)
222 
223 int gretl_matrix_set_complex (gretl_matrix *m, int c);
224 
225 int gretl_matrix_set_complex_full (gretl_matrix *m, int c);
226 
227 int get_gretl_matrix_err (void);
228 
229 void clear_gretl_matrix_err (void);
230 
231 void gretl_matrix_print (const gretl_matrix *m, const char *msg);
232 
233 int gretl_matrix_na_check (const gretl_matrix *m);
234 
235 int gretl_matrix_is_symmetric (const gretl_matrix *m);
236 
237 int gretl_matrix_is_idempotent (const gretl_matrix *m, double tol);
238 
239 void gretl_matrix_xtr_symmetric (gretl_matrix *m);
240 
241 void gretl_matrix_set_equals_tolerance (double tol);
242 
243 void gretl_matrix_unset_equals_tolerance (void);
244 
245 gretl_matrix *gretl_matrix_alloc (int rows, int cols);
246 
247 gretl_matrix *gretl_cmatrix_new (int r, int c);
248 
249 gretl_matrix *gretl_cmatrix_new0 (int r, int c);
250 
251 gretl_matrix *gretl_matching_matrix_new (int r, int c,
252 					 const gretl_matrix *m);
253 
254 gretl_matrix *gretl_matrix_reuse (gretl_matrix *m, int rows, int cols);
255 
256 int gretl_matrix_realloc (gretl_matrix *m, int rows, int cols);
257 
258 gretl_matrix *gretl_matrix_init (gretl_matrix *m);
259 
260 gretl_matrix *gretl_matrix_init_full (gretl_matrix *m,
261 				      int rows, int cols,
262 				      double *val);
263 
264 gretl_matrix *gretl_matrix_replace (gretl_matrix **pa,
265 				    gretl_matrix *b);
266 
267 int gretl_matrix_replace_content (gretl_matrix *targ,
268 				  gretl_matrix *donor);
269 
270 void gretl_matrix_block_destroy (gretl_matrix_block *B);
271 
272 void gretl_matrix_block_zero (gretl_matrix_block *B);
273 
274 gretl_matrix_block *gretl_matrix_block_new (gretl_matrix **pm, ...);
275 
276 int gretl_matrix_block_n_matrices (gretl_matrix_block *B);
277 
278 gretl_matrix *gretl_matrix_block_get_matrix (gretl_matrix_block *B,
279 					     int i);
280 
281 gretl_matrix *gretl_identity_matrix_new (int n);
282 
283 gretl_matrix *gretl_DW_matrix_new (int n);
284 
285 gretl_matrix *gretl_zero_matrix_new (int r, int c);
286 
287 gretl_matrix *gretl_unit_matrix_new (int r, int c);
288 
289 gretl_matrix *gretl_null_matrix_new (void);
290 
291 gretl_matrix *gretl_matrix_seq (double start, double end,
292 				double step, int *err);
293 
294 gretl_matrix *gretl_matrix_copy (const gretl_matrix *m);
295 
296 int gretl_matrix_copy_row (gretl_matrix *dest, int di,
297 			   const gretl_matrix *src, int si);
298 
299 int gretl_matrix_inscribe_I (gretl_matrix *m, int row, int col, int n);
300 
301 gretl_matrix *gretl_matrix_copy_transpose (const gretl_matrix *m);
302 
303 gretl_matrix *gretl_matrix_reverse_rows (const gretl_matrix *m, int *err);
304 
305 gretl_matrix *gretl_matrix_reverse_cols (const gretl_matrix *m, int *err);
306 
307 gretl_matrix *gretl_matrix_get_diagonal (const gretl_matrix *m, int *err);
308 
309 int gretl_matrix_set_diagonal (gretl_matrix *targ,
310 			       const gretl_matrix *src,
311 			       double x);
312 
313 gretl_matrix *gretl_matrix_get_triangle (const gretl_matrix *m,
314 					 int upper, int *err);
315 
316 int gretl_matrix_set_triangle (gretl_matrix *targ,
317 			       const gretl_matrix *src,
318 			       double x, int upper);
319 
320 int gretl_matrix_get_row (const gretl_matrix *m, int i, gretl_vector *v);
321 
322 double gretl_matrix_trace (const gretl_matrix *m);
323 
324 int gretl_matrix_random_fill (gretl_matrix *m, int dist);
325 
326 gretl_matrix *gretl_random_matrix_new (int r, int c, int dist);
327 
328 gretl_matrix *gretl_matrix_resample (const gretl_matrix *m,
329 				     int draws, int *err);
330 
331 int gretl_matrix_resample2 (gretl_matrix *targ,
332 			    const gretl_matrix *src);
333 
334 gretl_matrix *gretl_matrix_block_resample (const gretl_matrix *m,
335 					   int blocklen, int draws,
336 					   int *err);
337 
338 int gretl_matrix_block_resample2 (gretl_matrix *targ,
339 				  const gretl_matrix *src,
340 				  int blocklen, int *z);
341 
342 double gretl_vector_mean (const gretl_vector *v);
343 
344 double gretl_vector_variance (const gretl_vector *v);
345 
346 void gretl_matrix_zero (gretl_matrix *m);
347 
348 int gretl_matrix_zero_upper (gretl_matrix *m);
349 
350 int gretl_matrix_zero_lower (gretl_matrix *m);
351 
352 int gretl_matrix_mirror (gretl_matrix *m, char uplo);
353 
354 void gretl_matrix_fill (gretl_matrix *m, double x);
355 
356 void gretl_matrix_multiply_by_scalar (gretl_matrix *m, double x);
357 
358 int gretl_matrix_divide_by_scalar (gretl_matrix *m, double x);
359 
360 void gretl_matrix_switch_sign (gretl_matrix *m);
361 
362 gretl_matrix *gretl_matrix_dot_op (const gretl_matrix *a,
363 				   const gretl_matrix *b,
364 				   int op, int *err);
365 
366 ConfType dot_operator_conf (const gretl_matrix *A,
367 			    const gretl_matrix *B,
368 			    int *r, int *c);
369 
370 gretl_matrix *gretl_matrix_complex_multiply (const gretl_matrix *a,
371 					     const gretl_matrix *b,
372 					     int force_complex,
373 					     int *err);
374 
375 gretl_matrix *gretl_matrix_divide (const gretl_matrix *a,
376 				   const gretl_matrix *b,
377 				   GretlMatrixMod mod,
378 				   int *err);
379 
380 gretl_matrix *gretl_matrix_complex_divide (const gretl_matrix *a,
381 					   const gretl_matrix *b,
382 					   int force_complex,
383 					   int *err);
384 
385 gretl_matrix *gretl_matrix_exp (const gretl_matrix *m, int *err);
386 
387 gretl_matrix *gretl_matrix_polroots (const gretl_matrix *a,
388 				     int force_complex,
389 				     int *err);
390 
391 void gretl_matrix_raise (gretl_matrix *m, double x);
392 
393 void gretl_matrix_free (gretl_matrix *m);
394 
395 double *gretl_matrix_steal_data (gretl_matrix *m);
396 
397 int gretl_vector_copy_values (gretl_vector *targ,
398 			      const gretl_vector *src);
399 
400 int gretl_matrix_copy_values (gretl_matrix *targ,
401 			      const gretl_matrix *src);
402 
403 int gretl_matrix_copy_data (gretl_matrix *targ,
404 			    const gretl_matrix *src);
405 
406 int gretl_matrix_copy_values_shaped (gretl_matrix *targ,
407 				     const gretl_matrix *src);
408 
409 int gretl_matrix_add_to (gretl_matrix *targ, const gretl_matrix *src);
410 
411 int gretl_matrix_add (const gretl_matrix *a, const gretl_matrix *b,
412 		      gretl_matrix *c);
413 
414 int gretl_matrix_add_transpose_to (gretl_matrix *targ,
415 				   const gretl_matrix *src);
416 
417 int
418 gretl_matrix_subtract_from (gretl_matrix *targ, const gretl_matrix *src);
419 
420 int
421 gretl_matrix_subtract (const gretl_matrix *a, const gretl_matrix *b,
422 		       gretl_matrix *c);
423 
424 int
425 gretl_matrix_subtract_reversed (const gretl_matrix *a, gretl_matrix *b);
426 
427 int gretl_matrix_I_minus (gretl_matrix *m);
428 
429 int gretl_matrix_transpose_in_place (gretl_matrix *m);
430 
431 int gretl_matrix_transpose (gretl_matrix *targ, const gretl_matrix *src);
432 
433 int gretl_square_matrix_transpose (gretl_matrix *m);
434 
435 int gretl_matrix_add_self_transpose (gretl_matrix *m);
436 
437 int
438 gretl_matrix_vectorize (gretl_matrix *targ, const gretl_matrix *src);
439 
440 gretl_matrix *gretl_matrix_vectorize_new (const gretl_matrix *m);
441 
442 int
443 gretl_matrix_unvectorize (gretl_matrix *targ, const gretl_matrix *src);
444 
445 int
446 gretl_matrix_vectorize_h (gretl_matrix *targ, const gretl_matrix *src);
447 
448 int
449 gretl_matrix_unvectorize_h (gretl_matrix *targ, const gretl_matrix *src);
450 
451 int gretl_matrix_inscribe_matrix (gretl_matrix *targ,
452 				  const gretl_matrix *src,
453 				  int row, int col,
454 				  GretlMatrixMod mod);
455 
456 int gretl_matrix_extract_matrix (gretl_matrix *targ,
457 				 const gretl_matrix *src,
458 				 int row, int col,
459 				 GretlMatrixMod mod);
460 
461 int gretl_matrix_multiply_mod (const gretl_matrix *a, GretlMatrixMod amod,
462 			       const gretl_matrix *b, GretlMatrixMod bmod,
463 			       gretl_matrix *c, GretlMatrixMod cmod);
464 
465 int gretl_matrix_multiply_mod_single (const gretl_matrix *a,
466 				      GretlMatrixMod amod,
467 				      const gretl_matrix *b,
468 				      GretlMatrixMod bmod,
469 				      gretl_matrix *c,
470 				      GretlMatrixMod cmod);
471 
472 int gretl_matrix_multiply (const gretl_matrix *a,
473 			   const gretl_matrix *b,
474 			   gretl_matrix *c);
475 
476 int gretl_matrix_multiply_single (const gretl_matrix *a,
477 				  const gretl_matrix *b,
478 				  gretl_matrix *c);
479 
480 gretl_matrix *gretl_matrix_multiply_new (const gretl_matrix *a,
481 					 const gretl_matrix *b,
482 					 int *err);
483 
484 int
485 gretl_matrix_kronecker_product (const gretl_matrix *A,
486 				const gretl_matrix *B,
487 				gretl_matrix *K);
488 
489 gretl_matrix *
490 gretl_matrix_kronecker_product_new (const gretl_matrix *A,
491 				    const gretl_matrix *B,
492 				    int *err);
493 
494 int gretl_matrix_hdproduct (const gretl_matrix *A,
495 			    const gretl_matrix *B,
496 			    gretl_matrix *C);
497 
498 gretl_matrix *
499 gretl_matrix_hdproduct_new (const gretl_matrix *A,
500 			    const gretl_matrix *B,
501 			    int *err);
502 
503 
504 int
505 gretl_matrix_I_kronecker (int p, const gretl_matrix *B,
506 			  gretl_matrix *K);
507 
508 gretl_matrix *
509 gretl_matrix_I_kronecker_new (int p, const gretl_matrix *B, int *err);
510 
511 int
512 gretl_matrix_kronecker_I (const gretl_matrix *A, int r,
513 			  gretl_matrix *K);
514 
515 gretl_matrix *
516 gretl_matrix_kronecker_I_new (const gretl_matrix *A, int r, int *err);
517 
518 gretl_matrix *gretl_matrix_pow (const gretl_matrix *A,
519 				double s, int *err);
520 
521 double gretl_matrix_dot_product (const gretl_matrix *a, GretlMatrixMod amod,
522 				 const gretl_matrix *b, GretlMatrixMod bmod,
523 				 int *err);
524 
525 double gretl_vector_dot_product (const gretl_vector *a, const gretl_vector *b,
526 				 int *err);
527 
528 gretl_matrix *gretl_rmatrix_vector_stat (const gretl_matrix *m,
529 					 GretlVecStat vs, int rowwise,
530 					 int *err);
531 
532 gretl_matrix *gretl_matrix_column_sd (const gretl_matrix *m, int *err);
533 
534 gretl_matrix *gretl_matrix_column_sd2 (const gretl_matrix *m,
535 				       int df, int *err);
536 
537 void gretl_matrix_demean_by_row (gretl_matrix *m);
538 
539 int gretl_matrix_standardize (gretl_matrix *m, int dfcorr);
540 
541 int gretl_matrix_center (gretl_matrix *m);
542 
543 gretl_matrix *gretl_matrix_quantiles (const gretl_matrix *m,
544 				      const gretl_matrix *p,
545 				      int *err);
546 
547 double gretl_matrix_determinant (gretl_matrix *a, int *err);
548 
549 double gretl_matrix_log_determinant (gretl_matrix *a, int *err);
550 
551 double gretl_matrix_log_abs_determinant (gretl_matrix *a, int *err);
552 
553 double gretl_vcv_log_determinant (const gretl_matrix *m, int *err);
554 
555 double gretl_matrix_one_norm (const gretl_matrix *m);
556 
557 double gretl_matrix_infinity_norm (const gretl_matrix *m);
558 
559 int gretl_LU_solve (gretl_matrix *a, gretl_matrix *b);
560 
561 int gretl_LU_solve_invert (gretl_matrix *a, gretl_matrix *b);
562 
563 int gretl_cholesky_decomp_solve (gretl_matrix *a, gretl_matrix *b);
564 
565 int gretl_cholesky_solve (const gretl_matrix *a, gretl_vector *b);
566 
567 int gretl_cholesky_invert (gretl_matrix *a);
568 
569 gretl_vector *gretl_toeplitz_solve (const gretl_vector *c,
570 				    const gretl_vector *r,
571 				    const gretl_vector *b,
572 				    int *err);
573 
574 gretl_matrix *gretl_matrix_XTX_new (const gretl_matrix *X);
575 
576 int gretl_inverse_from_cholesky_decomp (gretl_matrix *targ,
577 					const gretl_matrix *src);
578 
579 int gretl_invert_general_matrix (gretl_matrix *a);
580 
581 int gretl_invert_symmetric_indef_matrix (gretl_matrix *a);
582 
583 int gretl_invert_symmetric_matrix (gretl_matrix *a);
584 
585 int gretl_invert_symmetric_matrix2 (gretl_matrix *a, double *ldet);
586 
587 int gretl_invert_packed_symmetric_matrix (gretl_matrix *v);
588 
589 int gretl_invert_triangular_matrix (gretl_matrix *a, char uplo);
590 
591 int gretl_invert_diagonal_matrix (gretl_matrix *a);
592 
593 int gretl_invert_matrix (gretl_matrix *a);
594 
595 int gretl_matrix_moore_penrose (gretl_matrix *A);
596 
597 int gretl_SVD_invert_matrix (gretl_matrix *a);
598 
599 int gretl_invpd (gretl_matrix *a);
600 
601 int gretl_matrix_SVD (const gretl_matrix *a, gretl_matrix **pu,
602 		      gretl_vector **ps, gretl_matrix **pvt,
603 		      int full);
604 
605 double gretl_symmetric_matrix_rcond (const gretl_matrix *m, int *err);
606 
607 double gretl_matrix_rcond (const gretl_matrix *m, int *err);
608 
609 double gretl_matrix_cond_index (const gretl_matrix *m, int *err);
610 
611 int gretl_symmetric_eigen_sort (gretl_matrix *evals, gretl_matrix *evecs,
612 				int rank);
613 
614 gretl_matrix *
615 gretl_general_matrix_eigenvals (const gretl_matrix *m, int *err);
616 
617 gretl_matrix *
618 gretl_symmetric_matrix_eigenvals (gretl_matrix *m,
619 				  int eigenvecs,
620 				  int *err);
621 
622 gretl_matrix *
623 gretl_symm_matrix_eigenvals_descending (gretl_matrix *m,
624 					int eigenvecs,
625 					int *err);
626 
627 gretl_matrix *
628 gretl_gensymm_eigenvals (const gretl_matrix *A,
629 			 const gretl_matrix *B,
630 			 gretl_matrix *V,
631 			 int *err);
632 
633 gretl_matrix *gretl_dgeev (const gretl_matrix *A,
634 			   gretl_matrix *VR,
635 			   gretl_matrix *VL,
636 			   int *err);
637 
638 gretl_matrix *old_eigengen (const gretl_matrix *m,
639 			    gretl_matrix *VR,
640 			    gretl_matrix *VL,
641 			    int *err);
642 
643 double gretl_symm_matrix_lambda_min (const gretl_matrix *m, int *err);
644 
645 double gretl_symm_matrix_lambda_max (const gretl_matrix *m, int *err);
646 
647 gretl_matrix *gretl_matrix_right_nullspace (const gretl_matrix *M,
648 					    int *err);
649 
650 gretl_matrix *gretl_matrix_left_nullspace (const gretl_matrix *M,
651 					   GretlMatrixMod mod,
652 					   int *err);
653 
654 gretl_matrix *
655 gretl_matrix_row_concat (const gretl_matrix *a, const gretl_matrix *b,
656 			 int *err);
657 
658 gretl_matrix *
659 gretl_matrix_col_concat (const gretl_matrix *a, const gretl_matrix *b,
660 			 int *err);
661 
662 gretl_matrix *gretl_matrix_direct_sum (const gretl_matrix *a,
663 				       const gretl_matrix *b,
664 				       int *err);
665 
666 int
667 gretl_matrix_inplace_colcat (gretl_matrix *a, const gretl_matrix *b,
668 			     const char *mask);
669 
670 gretl_matrix *gretl_matrix_cumcol (const gretl_matrix *m, int *err);
671 
672 gretl_matrix *gretl_matrix_diffcol (const gretl_matrix *m,
673 				    double missval, int *err);
674 
675 gretl_matrix *gretl_matrix_lag (const gretl_matrix *m,
676 				const gretl_vector *k,
677 				gretlopt opt,
678 				double missval);
679 
680 int gretl_matrix_inplace_lag (gretl_matrix *targ,
681 			      const gretl_matrix *src,
682 			      int k);
683 
684 int gretl_matrix_cholesky_decomp (gretl_matrix *a);
685 
686 int gretl_matrix_psd_root (gretl_matrix *a, int check);
687 
688 int gretl_matrix_QR_decomp (gretl_matrix *M,
689 			    gretl_matrix *R);
690 
691 int gretl_matrix_QR_pivot_decomp (gretl_matrix *M,
692 				  gretl_matrix *R,
693 				  int **order);
694 
695 int gretl_check_QR_rank (const gretl_matrix *R,
696 			 int *err,
697 			 double *rcnd);
698 
699 int gretl_matrix_rank (const gretl_matrix *a, int *err);
700 
701 int gretl_matrix_ols (const gretl_vector *y,
702 		      const gretl_matrix *X,
703 		      gretl_vector *b,
704 		      gretl_matrix *vcv,
705 		      gretl_vector *uhat,
706 		      double *s2);
707 
708 int gretl_matrix_multi_ols (const gretl_matrix *Y,
709 			    const gretl_matrix *X,
710 			    gretl_matrix *B,
711 			    gretl_matrix *E,
712 			    gretl_matrix **XTXi);
713 
714 int gretl_matrix_multi_SVD_ols (const gretl_matrix *Y,
715 				const gretl_matrix *X,
716 				gretl_matrix *B,
717 				gretl_matrix *E,
718 				gretl_matrix **XTXi);
719 
720 int gretl_matrix_QR_ols (const gretl_matrix *Y,
721 			 const gretl_matrix *X,
722 			 gretl_matrix *B,
723 			 gretl_matrix *E,
724 			 gretl_matrix **XTXi,
725 			 gretl_matrix **Qout);
726 
727 double gretl_matrix_r_squared (const gretl_matrix *y,
728 			       const gretl_matrix *X,
729 			       const gretl_matrix *b,
730 			       int *err);
731 
732 int gretl_matrix_SVD_johansen_solve (const gretl_matrix *R0,
733 				     const gretl_matrix *R1,
734 				     gretl_matrix *evals,
735 				     gretl_matrix *B,
736 				     gretl_matrix *A,
737 				     int jrank);
738 
739 int
740 gretl_matrix_restricted_ols (const gretl_vector *y,
741 			     const gretl_matrix *X,
742 			     const gretl_matrix *R,
743 			     const gretl_vector *q,
744 			     gretl_vector *b,
745 			     gretl_matrix *vcv,
746 			     gretl_vector *uhat,
747 			     double *s2);
748 
749 int
750 gretl_matrix_restricted_multi_ols (const gretl_matrix *Y,
751 				   const gretl_matrix *X,
752 				   const gretl_matrix *R,
753 				   const gretl_matrix *q,
754 				   gretl_matrix *B,
755 				   gretl_matrix *U,
756 				   gretl_matrix **W);
757 
758 int gretl_matrix_SVD_ols (const gretl_vector *y,
759 			  const gretl_matrix *X,
760 			  gretl_vector *b,
761 			  gretl_matrix *vcv,
762 			  gretl_vector *uhat,
763 			  double *s2);
764 
765 int gretl_matrix_qform (const gretl_matrix *A,
766 			GretlMatrixMod amod,
767 			const gretl_matrix *X,
768 			gretl_matrix *C,
769 			GretlMatrixMod cmod);
770 
771 double gretl_scalar_qform (const gretl_vector *b,
772 			   const gretl_matrix *X,
773 			   int *err);
774 
775 int gretl_matrix_columnwise_product (const gretl_matrix *A,
776 				     const gretl_matrix *B,
777 				     const gretl_matrix *S,
778 				     gretl_matrix *C);
779 
780 int
781 gretl_matrix_diagonal_sandwich (const gretl_vector *d,
782 				const gretl_matrix *X,
783 				gretl_matrix *DXD);
784 
785 int gretl_matrix_set_t1 (gretl_matrix *m, int t);
786 
787 int gretl_matrix_set_t2 (gretl_matrix *m, int t);
788 
789 int gretl_matrix_get_t1 (const gretl_matrix *m);
790 
791 int gretl_matrix_get_t2 (const gretl_matrix *m);
792 
793 int gretl_matrix_is_dated (const gretl_matrix *m);
794 
795 int gretl_is_identity_matrix (const gretl_matrix *m);
796 
797 int gretl_is_zero_matrix (const gretl_matrix *m);
798 
799 gretl_matrix *gretl_matrix_isfinite (const gretl_matrix *m, int *err);
800 
801 int gretl_matrix_get_structure (const gretl_matrix *m);
802 
803 int gretl_matrices_are_equal (const gretl_matrix *a,
804 			      const gretl_matrix *b,
805 			      double tol, int *err);
806 
807 gretl_matrix *gretl_covariance_matrix (const gretl_matrix *m,
808 				       int corr, int dfc,
809 				       int *err);
810 
811 gretl_matrix *gretl_matrix_GG_inverse (const gretl_matrix *G,
812 				       int *err);
813 
814 gretl_matrix *gretl_matrix_varsimul (const gretl_matrix *A,
815 				     const gretl_matrix *U,
816 				     const gretl_matrix *x0,
817 				     int *err);
818 
819 gretl_matrix **gretl_matrix_array_new (int n);
820 
821 gretl_matrix **
822 gretl_matrix_array_new_with_size (int n, int rows, int cols);
823 
824 void gretl_matrix_array_free (gretl_matrix **A, int n);
825 
826 gretl_matrix *gretl_matrix_values (const double *x, int n,
827 				   gretlopt opt, int *err);
828 
829 gretl_matrix *gretl_matrix_shape (const gretl_matrix *A,
830 				  int r, int c, int *err);
831 
832 gretl_matrix *gretl_matrix_trim_rows (const gretl_matrix *A,
833 				      int ttop, int tbot,
834 				      int *err);
835 
836 gretl_matrix *gretl_matrix_minmax (const gretl_matrix *A,
837 				   int mm, int rc, int idx,
838 				   int *err);
839 
840 double gretl_matrix_global_minmax (const gretl_matrix *A,
841 				   int mm, int *err);
842 
843 double gretl_matrix_global_sum (const gretl_matrix *A,
844 				int *err);
845 
846 gretl_matrix *gretl_matrix_pca (const gretl_matrix *X, int p,
847 				gretlopt opt, int *err);
848 
849 gretl_matrix *gretl_matrix_xtab (int t1, int t2, const double *x,
850 				 const double *y, int *err);
851 
852 gretl_matrix *matrix_matrix_xtab (const gretl_matrix *x,
853 				  const gretl_matrix *y,
854 				  int *err);
855 
856 gretl_matrix *gretl_matrix_bool_sel(const gretl_matrix *A,
857 				    const gretl_matrix *sel,
858 				    int rowsel, int *err);
859 
860 gretl_matrix *gretl_matrix_sort_by_column (const gretl_matrix *m,
861 					   int k, int *err);
862 
863 gretl_matrix *gretl_vector_sort (const gretl_matrix *v,
864 				 int descending,
865 				 int *err);
866 
867 gretl_matrix *gretl_matrix_covariogram (const gretl_matrix *X,
868 					const gretl_matrix *u,
869 					const gretl_matrix *w,
870 					int p, int *err);
871 
872 void gretl_matrix_transcribe_obs_info (gretl_matrix *targ,
873 				       const gretl_matrix *src);
874 
875 int gretl_matrix_set_colnames (gretl_matrix *m, char **S);
876 
877 int gretl_matrix_set_rownames (gretl_matrix *m, char **S);
878 
879 const char **gretl_matrix_get_colnames (const gretl_matrix *m);
880 
881 const char **gretl_matrix_get_rownames (const gretl_matrix *m);
882 
883 void gretl_matrix_destroy_info (gretl_matrix *m);
884 
885 void lapack_mem_free (void);
886 
887 void set_blas_mnk_min (int mnk);
888 
889 int get_blas_mnk_min (void);
890 
891 void set_simd_k_max (int k);
892 
893 int get_simd_k_max (void);
894 
895 void set_simd_mn_min (int mn);
896 
897 int get_simd_mn_min (void);
898 
899 #ifdef  __cplusplus
900 }
901 #endif
902 
903 #endif /* GRETL_MATRIX_H */
904