1
/* ocamlgsl - OCaml interface to GSL */
2
/* Copyright (�) 2002 - Olivier Andrieu */
3
/* distributed under the terms of the GPL version 2 */
6
#include <gsl/gsl_linalg.h>
8
#include "mlgsl_matrix_double.h"
9
#include "mlgsl_vector_double.h"
10
#include "mlgsl_permut.h"
13
/* simple matrix operations */
14
value ml_gsl_linalg_matmult_mod(value A, value omodA,
18
gsl_linalg_matrix_mod_t modA = Opt_arg(omodA, Int_val, GSL_LINALG_MOD_NONE);
19
gsl_linalg_matrix_mod_t modB = Opt_arg(omodB, Int_val, GSL_LINALG_MOD_NONE);
20
_DECLARE_MATRIX3(A, B, C);
21
_CONVERT_MATRIX3(A, B, C);
22
gsl_linalg_matmult_mod(&m_A, modA, &m_B, modB, &m_C);
28
/* LU decomposition */
30
value ml_gsl_linalg_LU_decomp(value A, value P)
33
GSL_PERMUT_OF_BIGARRAY(P);
36
gsl_linalg_LU_decomp(&m_A, &perm_P, &sign);
40
value ml_gsl_linalg_LU_solve(value LU, value P, value B, value X)
42
GSL_PERMUT_OF_BIGARRAY(P);
44
_DECLARE_VECTOR2(B,X);
46
_CONVERT_VECTOR2(B,X);
47
gsl_linalg_LU_solve(&m_LU, &perm_P, &v_B, &v_X);
51
value ml_gsl_linalg_LU_svx(value LU, value P, value X)
53
GSL_PERMUT_OF_BIGARRAY(P);
58
gsl_linalg_LU_svx(&m_LU, &perm_P, &v_X);
62
value ml_gsl_linalg_LU_refine(value A, value LU, value P,
63
value B, value X, value RES)
65
GSL_PERMUT_OF_BIGARRAY(P);
66
_DECLARE_MATRIX2(A, LU);
67
_DECLARE_VECTOR3(B, X, RES);
68
_CONVERT_MATRIX2(A, LU);
69
_CONVERT_VECTOR3(B, X, RES);
70
gsl_linalg_LU_refine(&m_A, &m_LU, &perm_P, &v_B, &v_X, &v_RES);
74
value ml_gsl_linalg_LU_refine_bc(value *argv, int argc)
76
return ml_gsl_linalg_LU_refine(argv[0], argv[1], argv[2],
77
argv[3], argv[4], argv[5]);
80
value ml_gsl_linalg_LU_invert(value LU, value P, value INV)
82
GSL_PERMUT_OF_BIGARRAY(P);
83
_DECLARE_MATRIX2(LU, INV);
84
_CONVERT_MATRIX2(LU, INV);
85
gsl_linalg_LU_invert(&m_LU, &perm_P, &m_INV);
89
value ml_gsl_linalg_LU_det(value LU, value sig)
93
return copy_double(gsl_linalg_LU_det(&m_LU, Int_val(sig)));
96
value ml_gsl_linalg_LU_lndet(value LU)
100
return copy_double(gsl_linalg_LU_lndet(&m_LU));
103
value ml_gsl_linalg_LU_sgndet(value LU, value sig)
107
return Val_int(gsl_linalg_LU_sgndet(&m_LU, Int_val(sig)));
112
/* QR decomposition */
113
value ml_gsl_linalg_QR_decomp(value A, value TAU)
116
_DECLARE_VECTOR(TAU);
118
_CONVERT_VECTOR(TAU);
119
gsl_linalg_QR_decomp(&m_A, &v_TAU);
124
value ml_gsl_linalg_QR_solve(value QR, value TAU, value B, value X)
127
_DECLARE_VECTOR3(B,X,TAU);
129
_CONVERT_VECTOR3(B,X,TAU);
130
gsl_linalg_QR_solve(&m_QR, &v_TAU, &v_B, &v_X);
134
value ml_gsl_linalg_QR_svx(value QR, value TAU, value X)
137
_DECLARE_VECTOR2(TAU, X);
139
_CONVERT_VECTOR2(TAU, X);
140
gsl_linalg_QR_svx(&m_QR, &v_TAU, &v_X);
144
value ml_gsl_linalg_QR_lssolve(value QR, value TAU, value B, value X,
148
_DECLARE_VECTOR4(TAU, RES, B, X);
150
_CONVERT_VECTOR4(TAU, RES, B, X);
151
gsl_linalg_QR_lssolve(&m_QR, &v_TAU, &v_B, &v_X, &v_RES);
155
value ml_gsl_linalg_QR_QTvec(value QR, value TAU, value V)
158
_DECLARE_VECTOR2(TAU, V);
160
_CONVERT_VECTOR2(TAU, V);
161
gsl_linalg_QR_QTvec(&m_QR, &v_TAU, &v_V);
165
value ml_gsl_linalg_QR_Qvec(value QR, value TAU, value V)
168
_DECLARE_VECTOR2(TAU, V);
170
_CONVERT_VECTOR2(TAU, V);
171
gsl_linalg_QR_Qvec(&m_QR, &v_TAU, &v_V);
175
value ml_gsl_linalg_QR_Rsolve(value QR, value B, value X)
178
_DECLARE_VECTOR2(B,X);
180
_CONVERT_VECTOR2(B,X);
181
gsl_linalg_QR_Rsolve(&m_QR, &v_B, &v_X);
185
value ml_gsl_linalg_QR_Rsvx(value QR, value X)
191
gsl_linalg_QR_Rsvx(&m_QR, &v_X);
195
value ml_gsl_linalg_QR_unpack(value QR, value TAU, value Q, value R)
197
_DECLARE_MATRIX3(QR, Q, R);
198
_DECLARE_VECTOR(TAU);
199
_CONVERT_MATRIX3(QR, Q, R);
200
_CONVERT_VECTOR(TAU);
201
gsl_linalg_QR_unpack(&m_QR, &v_TAU, &m_Q, &m_R);
205
value ml_gsl_linalg_QR_QRsolve(value Q, value R, value B, value X)
207
_DECLARE_MATRIX2(Q, R);
208
_DECLARE_VECTOR2(B, X);
209
_CONVERT_MATRIX2(Q, R);
210
_CONVERT_VECTOR2(B, X);
211
gsl_linalg_QR_QRsolve(&m_Q, &m_R, &v_B, &v_X);
215
value ml_gsl_linalg_QR_update(value Q, value R, value W, value V)
217
_DECLARE_MATRIX2(Q, R);
218
_DECLARE_VECTOR2(W, V);
219
_CONVERT_MATRIX2(Q, R);
220
_CONVERT_VECTOR2(W, V);
221
gsl_linalg_QR_update(&m_Q, &m_R, &v_W, &v_V);
225
value ml_gsl_linalg_R_solve(value R, value B, value X)
228
_DECLARE_VECTOR2(B, X);
230
_CONVERT_VECTOR2(B, X);
231
gsl_linalg_R_solve(&m_R, &v_B, &v_X);
236
/* value ml_gsl_linalg_R_svx(value R, value X) */
238
/* DECLARE_MATRIX(R); */
239
/* DECLARE_VECTOR(X); */
240
/* gsl_linalg_R_svx(&m_R, &v_X); */
241
/* return Val_unit; */
246
/* QR Decomposition with Column Pivoting */
247
value ml_gsl_linalg_QRPT_decomp(value A, value TAU, value P, value NORM)
250
GSL_PERMUT_OF_BIGARRAY(P);
252
_DECLARE_VECTOR2(TAU, NORM);
254
_CONVERT_VECTOR2(TAU, NORM);
255
gsl_linalg_QRPT_decomp(&m_A, &v_TAU, &perm_P, &signum, &v_NORM);
256
return Val_int(signum);
259
value ml_gsl_linalg_QRPT_decomp2(value A, value Q, value R,
260
value TAU, value P, value NORM)
263
GSL_PERMUT_OF_BIGARRAY(P);
264
_DECLARE_MATRIX3(A, Q, R);
265
_DECLARE_VECTOR2(TAU, NORM);
266
_CONVERT_MATRIX3(A, Q, R);
267
_CONVERT_VECTOR2(TAU, NORM);
268
gsl_linalg_QRPT_decomp2(&m_A, &m_Q, &m_R, &v_TAU, &perm_P, &signum, &v_NORM);
269
return Val_int(signum);
272
value ml_gsl_linalg_QRPT_decomp2_bc(value *argv, int argc)
274
return ml_gsl_linalg_QRPT_decomp2(argv[0], argv[1], argv[2],
275
argv[3], argv[4], argv[5]);
278
value ml_gsl_linalg_QRPT_solve(value QR, value TAU, value P,
281
GSL_PERMUT_OF_BIGARRAY(P);
283
_DECLARE_VECTOR3(TAU, B, X);
285
_CONVERT_VECTOR3(TAU, B, X);
286
gsl_linalg_QRPT_solve(&m_QR, &v_TAU, &perm_P, &v_B, &v_X);
290
value ml_gsl_linalg_QRPT_svx(value QR, value TAU, value P, value X)
292
GSL_PERMUT_OF_BIGARRAY(P);
294
_DECLARE_VECTOR2(TAU, X);
296
_CONVERT_VECTOR2(TAU, X);
297
gsl_linalg_QRPT_svx(&m_QR, &v_TAU, &perm_P, &v_X);
301
value ml_gsl_linalg_QRPT_QRsolve(value Q, value R, value P,
304
GSL_PERMUT_OF_BIGARRAY(P);
305
_DECLARE_MATRIX2(Q, R);
306
_DECLARE_VECTOR2(B, X);
307
_CONVERT_MATRIX2(Q, R);
308
_CONVERT_VECTOR2(B, X);
309
gsl_linalg_QRPT_QRsolve(&m_Q, &m_R, &perm_P, &v_B, &v_X);
313
value ml_gsl_linalg_QRPT_update(value Q, value R, value P,
316
GSL_PERMUT_OF_BIGARRAY(P);
317
_DECLARE_MATRIX2(Q, R);
318
_DECLARE_VECTOR2(U, V);
319
_CONVERT_MATRIX2(Q, R);
320
_CONVERT_VECTOR2(U, V);
321
gsl_linalg_QRPT_update(&m_Q, &m_R, &perm_P, &v_U, &v_V);
325
value ml_gsl_linalg_QRPT_Rsolve(value QR, value P,
328
GSL_PERMUT_OF_BIGARRAY(P);
330
_DECLARE_VECTOR2(B, X);
332
_CONVERT_VECTOR2(B, X);
333
gsl_linalg_QRPT_Rsolve(&m_QR, &perm_P, &v_B, &v_X);
337
value ml_gsl_linalg_QRPT_Rsvx(value QR, value P, value X)
339
GSL_PERMUT_OF_BIGARRAY(P);
344
gsl_linalg_QRPT_Rsvx(&m_QR, &perm_P, &v_X);
350
/* Singular Value Decomposition */
351
value ml_gsl_linalg_SV_decomp(value A, value V, value S, value WORK)
353
_DECLARE_MATRIX2(A, V);
354
_DECLARE_VECTOR2(S, WORK);
355
_CONVERT_MATRIX2(A, V);
356
_CONVERT_VECTOR2(S, WORK);
357
gsl_linalg_SV_decomp(&m_A, &m_V, &v_S, &v_WORK);
361
value ml_gsl_linalg_SV_decomp_mod(value A, value X, value V,
364
_DECLARE_MATRIX3(A, V, X);
365
_DECLARE_VECTOR2(S, WORK);
366
_CONVERT_MATRIX3(A, V, X);
367
_CONVERT_VECTOR2(S, WORK);
368
gsl_linalg_SV_decomp_mod(&m_A, &m_X, &m_V, &v_S, &v_WORK);
372
value ml_gsl_linalg_SV_decomp_jacobi(value A, value V, value S)
374
_DECLARE_MATRIX2(A, V);
376
_CONVERT_MATRIX2(A, V);
378
gsl_linalg_SV_decomp_jacobi(&m_A, &m_V, &v_S);
382
value ml_gsl_linalg_SV_solve(value U, value V, value S, value B, value X)
384
_DECLARE_MATRIX2(U, V);
385
_DECLARE_VECTOR3(S, B, X);
386
_CONVERT_MATRIX2(U, V);
387
_CONVERT_VECTOR3(S, B, X);
388
gsl_linalg_SV_solve(&m_U, &m_V, &v_S, &v_B, &v_X);
394
/* Cholesky decomposition */
396
value ml_gsl_linalg_cholesky_decomp(value A)
400
gsl_linalg_cholesky_decomp(&m_A);
404
value ml_gsl_linalg_cholesky_solve(value CHO, value B, value X)
406
_DECLARE_MATRIX(CHO);
407
_DECLARE_VECTOR2(B, X);
408
_CONVERT_MATRIX(CHO);
409
_CONVERT_VECTOR2(B, X);
410
gsl_linalg_cholesky_solve(&m_CHO, &v_B, &v_X);
414
value ml_gsl_linalg_cholesky_svx(value CHO, value X)
416
_DECLARE_MATRIX(CHO);
418
_CONVERT_MATRIX(CHO);
420
gsl_linalg_cholesky_svx(&m_CHO, &v_X);
426
/* Tridiagonal Decomposition of Real Symmetric Matrices */
427
value ml_gsl_linalg_symmtd_decomp(value A, value TAU)
430
_DECLARE_VECTOR(TAU);
432
_CONVERT_VECTOR(TAU);
433
gsl_linalg_symmtd_decomp(&m_A, &v_TAU);
437
value ml_gsl_linalg_symmtd_unpack(value A, value TAU, value Q,
438
value DIAG, value SUBDIAG)
440
_DECLARE_MATRIX2(A, Q);
441
_DECLARE_VECTOR3(TAU, DIAG, SUBDIAG);
442
_CONVERT_MATRIX2(A, Q);
443
_CONVERT_VECTOR3(TAU, DIAG, SUBDIAG);
444
gsl_linalg_symmtd_unpack(&m_A, &v_TAU, &m_Q, &v_DIAG, &v_SUBDIAG);
448
value ml_gsl_linalg_symmtd_unpack_T(value A, value DIAG, value SUBDIAG)
451
_DECLARE_VECTOR2(DIAG, SUBDIAG);
453
_CONVERT_VECTOR2(DIAG, SUBDIAG);
454
gsl_linalg_symmtd_unpack_T(&m_A, &v_DIAG, &v_SUBDIAG);
460
/* Tridiagonal Decomposition of Hermitian Matrices */
464
/* Bidiagonalization */
465
value ml_gsl_linalg_bidiag_decomp(value A, value TAU_U, value TAU_V)
468
_DECLARE_VECTOR2(TAU_U, TAU_V);
470
_CONVERT_VECTOR2(TAU_U, TAU_V);
471
gsl_linalg_bidiag_decomp(&m_A, &v_TAU_U, &v_TAU_V);
475
value ml_gsl_linalg_bidiag_unpack(value A, value TAU_U, value U,
476
value TAU_V, value V,
477
value DIAG, value SUPERDIAG)
479
_DECLARE_MATRIX3(A, U, V);
480
_DECLARE_VECTOR4(TAU_U, TAU_V, DIAG, SUPERDIAG);
481
_CONVERT_MATRIX3(A, U, V);
482
_CONVERT_VECTOR4(TAU_U, TAU_V, DIAG, SUPERDIAG);
483
gsl_linalg_bidiag_unpack(&m_A, &v_TAU_U, &m_U, &v_TAU_V, &m_V,
484
&v_DIAG, &v_SUPERDIAG);
488
value ml_gsl_linalg_bidiag_unpack_bc(value *argv, int argc)
490
return ml_gsl_linalg_bidiag_unpack(argv[0], argv[1], argv[2],
491
argv[3], argv[4], argv[5], argv[6]);
494
value ml_gsl_linalg_bidiag_unpack2(value A, value TAU_U, value TAU_V, value V)
496
_DECLARE_MATRIX2(A, V);
497
_DECLARE_VECTOR2(TAU_U, TAU_V);
498
_CONVERT_MATRIX2(A, V);
499
_CONVERT_VECTOR2(TAU_U, TAU_V);
500
gsl_linalg_bidiag_unpack2(&m_A, &v_TAU_U, &v_TAU_V, &m_V);
504
value ml_gsl_linalg_bidiag_unpack_B(value A, value DIAG, value SUPERDIAG)
507
_DECLARE_VECTOR2(DIAG, SUPERDIAG);
509
_CONVERT_VECTOR2(DIAG, SUPERDIAG);
510
gsl_linalg_bidiag_unpack_B(&m_A, &v_DIAG, &v_SUPERDIAG);
516
/* Householder solver */
517
value ml_gsl_linalg_HH_solve(value A, value B, value X)
520
_DECLARE_VECTOR2(B,X);
522
_CONVERT_VECTOR2(B,X);
523
gsl_linalg_HH_solve(&m_A, &v_B, &v_X);
527
value ml_gsl_linalg_HH_svx(value A, value X)
533
gsl_linalg_HH_svx(&m_A, &v_X);
538
/* Tridiagonal Systems */
539
value ml_gsl_linalg_solve_symm_tridiag(value DIAG, value E, value B, value X)
541
_DECLARE_VECTOR4(DIAG, E, B, X);
542
_CONVERT_VECTOR4(DIAG, E, B, X);
543
gsl_linalg_solve_symm_tridiag(&v_DIAG, &v_E, &v_B, &v_X);
547
value ml_gsl_linalg_solve_tridiag(value DIAG, value ABOVE, value BELOW,
550
_DECLARE_VECTOR5(DIAG, ABOVE, BELOW, B, X);
551
_CONVERT_VECTOR5(DIAG, ABOVE, BELOW, B, X);
552
gsl_linalg_solve_tridiag(&v_DIAG, &v_ABOVE, &v_BELOW, &v_B, &v_X);
556
value ml_gsl_linalg_solve_symm_cyc_tridiag(value DIAG, value E, value B, value X)
558
_DECLARE_VECTOR4(DIAG, E, B, X);
559
_CONVERT_VECTOR4(DIAG, E, B, X);
560
gsl_linalg_solve_symm_cyc_tridiag(&v_DIAG, &v_E, &v_B, &v_X);
564
value ml_gsl_linalg_solve_cyc_tridiag(value DIAG, value ABOVE, value BELOW,
567
_DECLARE_VECTOR5(DIAG, ABOVE, BELOW, B, X);
568
_CONVERT_VECTOR5(DIAG, ABOVE, BELOW, B, X);
569
gsl_linalg_solve_cyc_tridiag(&v_DIAG, &v_ABOVE, &v_BELOW, &v_B, &v_X);
575
#define GSL_MODE_val Int_val
577
value ml_gsl_linalg_exponential_ss(value A, value eA, value mode)
579
_DECLARE_MATRIX2(A, eA);
580
_CONVERT_MATRIX2(A, eA);
581
gsl_linalg_exponential_ss(&m_A, &m_eA, GSL_MODE_val(mode));