File: mlgsl_linalg_complex.c

package info (click to toggle)
ocamlgsl 0.6.0-7
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, squeeze, wheezy
  • size: 4,028 kB
  • ctags: 3,090
  • sloc: ml: 8,539; ansic: 7,338; makefile: 261; sh: 149; awk: 13
file content (146 lines) | stat: -rw-r--r-- 3,810 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* ocamlgsl - OCaml interface to GSL                        */
/* Copyright (©) 2002-2005 - Olivier Andrieu                */
/* distributed under the terms of the GPL version 2         */


#include <gsl/gsl_linalg.h>

#include "mlgsl_matrix_complex.h"
#include "mlgsl_vector_complex.h"
#include "mlgsl_permut.h"
#include "mlgsl_complex.h"


/* Complex LU decomposition */

CAMLprim value ml_gsl_linalg_complex_LU_decomp(value A, value P)
{
  int sign;
  GSL_PERMUT_OF_BIGARRAY(P);
  _DECLARE_MATRIX(A);
  _CONVERT_MATRIX(A);
  gsl_linalg_complex_LU_decomp(&m_A, &perm_P, &sign);
  return Val_int(sign);
}

CAMLprim value ml_gsl_linalg_complex_LU_solve(value LU, value P, value B, value X)
{
  GSL_PERMUT_OF_BIGARRAY(P);
  _DECLARE_MATRIX(LU);
  _DECLARE_VECTOR2(B,X);
  _CONVERT_MATRIX(LU);
  _CONVERT_VECTOR2(B,X);
  gsl_linalg_complex_LU_solve(&m_LU, &perm_P, &v_B, &v_X);
  return Val_unit;
}

CAMLprim value ml_gsl_linalg_complex_LU_svx(value LU, value P, value X)
{
  GSL_PERMUT_OF_BIGARRAY(P);
  _DECLARE_MATRIX(LU);
  _DECLARE_VECTOR(X);
  _CONVERT_MATRIX(LU);
  _CONVERT_VECTOR(X);
  gsl_linalg_complex_LU_svx(&m_LU, &perm_P, &v_X);
  return Val_unit;
}

CAMLprim value ml_gsl_linalg_complex_LU_refine(value A, value LU, value P, 
					       value B, value X, value RES)
{
  GSL_PERMUT_OF_BIGARRAY(P);
  _DECLARE_MATRIX2(A, LU);
  _DECLARE_VECTOR3(B, X, RES);
  _CONVERT_MATRIX2(A, LU);
  _CONVERT_VECTOR3(B, X, RES);
  gsl_linalg_complex_LU_refine(&m_A, &m_LU, &perm_P, &v_B, &v_X, &v_RES);
  return Val_unit;
}

CAMLprim value ml_gsl_linalg_complex_LU_refine_bc(value *argv, int argc)
{
  return ml_gsl_linalg_complex_LU_refine(argv[0], argv[1], argv[2],
					 argv[3], argv[4], argv[5]);
}

CAMLprim value ml_gsl_linalg_complex_LU_invert(value LU, value P, value INV)
{
  GSL_PERMUT_OF_BIGARRAY(P);
  _DECLARE_MATRIX2(LU, INV);
  _CONVERT_MATRIX2(LU, INV);
  gsl_linalg_complex_LU_invert(&m_LU, &perm_P, &m_INV);
  return Val_unit;
}

CAMLprim value ml_gsl_linalg_complex_LU_det(value LU, value sig)
{
  gsl_complex z;
  _DECLARE_MATRIX(LU);
  _CONVERT_MATRIX(LU);
  z = gsl_linalg_complex_LU_det(&m_LU, Int_val(sig));
  return copy_complex(&z);
}

CAMLprim value ml_gsl_linalg_complex_LU_lndet(value LU)
{
  _DECLARE_MATRIX(LU);
  _CONVERT_MATRIX(LU);
  return copy_double(gsl_linalg_complex_LU_lndet(&m_LU));
}

CAMLprim value ml_gsl_linalg_complex_LU_sgndet(value LU, value sig)
{
  gsl_complex z;
  _DECLARE_MATRIX(LU);
  _CONVERT_MATRIX(LU);
  z = gsl_linalg_complex_LU_sgndet(&m_LU, Int_val(sig)) ;
  return copy_complex(&z);
}


/* Hermitian to symmetric tridiagonal decomposition */

/* Those are tricky 'coz they mix real & complex matrices ... */

#undef BASE_TYPE
#undef TYPE
#undef _DECLARE_BASE_TYPE
#undef _CONVERT_BASE_TYPE
#undef DECLARE_BASE_TYPE
#undef FUNCTION

#include "mlgsl_matrix_double.h"
#include "mlgsl_vector_double.h"

CAMLprim value ml_gsl_linalg_hermtd_decomp (value A, value tau)
{
  _DECLARE_COMPLEX_MATRIX(A);
  _DECLARE_COMPLEX_VECTOR(tau);
  _CONVERT_COMPLEX_MATRIX(A);
  _CONVERT_COMPLEX_VECTOR(tau);
  gsl_linalg_hermtd_decomp(&m_A, &v_tau);
  return Val_unit;
}

CAMLprim value ml_gsl_linalg_hermtd_unpack (value A, value tau, value Q, 
					    value diag, value subdiag)
{
  _DECLARE_COMPLEX_VECTOR(tau);
  _DECLARE_VECTOR2(diag,subdiag);
  _DECLARE_COMPLEX_MATRIX2(A,Q);
  _CONVERT_COMPLEX_VECTOR(tau);
  _CONVERT_VECTOR2(diag,subdiag);
  _CONVERT_COMPLEX_MATRIX2(A,Q);
  gsl_linalg_hermtd_unpack(&m_A, &v_tau, &m_Q, &v_diag, &v_subdiag);
  return Val_unit;
}

CAMLprim value ml_gsl_linalg_hermtd_unpack_T (value A, value diag, value subdiag)
{
  _DECLARE_COMPLEX_MATRIX(A);
  _DECLARE_VECTOR2(diag,subdiag);
  _CONVERT_COMPLEX_MATRIX(A);
  _CONVERT_VECTOR2(diag,subdiag);
  gsl_linalg_hermtd_unpack_T(&m_A, &v_diag, &v_subdiag);
  return Val_unit;
}