1 package Math
::GSL
::Matrix
::Test
;
2 use base
q{Test::Class};
4 use Math
::GSL
::Matrix qw
/:all/;
5 use Math
::GSL
::Vector qw
/:all/;
6 use Math
::GSL qw
/:all/;
10 sub make_fixture
: Test
(setup
) {
12 $self->{matrix
} = gsl_matrix_alloc
(5,5);
13 $self->{obj
} = Math
::GSL
::Matrix
->new(5,5);
16 sub teardown
: Test
(teardown
) {
17 unlink 'matrix' if -f
'matrix';
20 sub GSL_MATRIX_ALLOC
: Tests
{
21 my $matrix = gsl_matrix_alloc
(5,5);
22 isa_ok
($matrix, 'Math::GSL::Matrix');
25 sub GSL_MATRIX_SET
: Tests
{
27 map { gsl_matrix_set
($self->{matrix
}, $_,$_, $_ ** 2) } (0..4);
29 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, $_) } (0..4);
30 ok_similar
( [ @got ], [ map { $_**2 } (0..4) ] );
33 sub GSL_MATRIX_CALLOC
: Tests
{
34 my $matrix = gsl_matrix_calloc
(5,5);
35 isa_ok
($matrix, 'Math::GSL::Matrix');
37 my @got = map { gsl_matrix_get
($matrix, $_, $_) } (0..4);
38 ok_similar
( [ @got ], [ (0) x
5 ], 'gsl_matrix_calloc' );
41 sub GSL_MATRIX_FREE
: Tests
{
42 my $matrix = gsl_matrix_calloc
(5,5);
43 isa_ok
($matrix, 'Math::GSL::Matrix');
45 is
(gsl_matrix_get
($matrix, 0, 0), 0);
46 gsl_matrix_free
($matrix);
49 sub GSL_MATRIX_SUBMATRIX
: Tests
{
50 my $matrix = gsl_matrix_alloc
(5,5);
51 map { gsl_matrix_set
($matrix, $_,$_, $_) } (0..4);
52 my $subMatrix = gsl_matrix_submatrix
($matrix, 0, 0, 2, 2);
53 my @got = map { gsl_matrix_get
($matrix, $_, $_) } (0..2);
54 ok_similar
( [ @got ], [ 0..2 ] );
57 sub GSL_MATRIX_ROW
: Tests
{
60 map { gsl_matrix_set
($self->{matrix
}, $_,$line, $_) } (0..4);
63 my $vector_view = gsl_matrix_row
($self->{matrix
}, 2);
64 my @got = map { gsl_vector_get
($vector_view->{vector
}, $_) } (0..4);
65 ok_similar
( [ @got ], [ (2)x
5], 'gsl_matrix_row' );
68 sub GSL_MATRIX_COLUMN
: Tests
{
70 my $view = gsl_vector_alloc
(5);
73 map { gsl_matrix_set
($self->{matrix
}, $line,$_, $line*$_) } (0..4);
75 $view = gsl_matrix_column
($self->{matrix
}, 2);
76 my $vec = $view->swig_vector_get();
78 my @got = map { gsl_vector_get
($vec, $_) } (0..4);
79 ok_similar
( [ @got ], [0,2,4,6,8 ], 'gsl_matrix_column' );
82 sub GSL_MATRIX_DIAGONAL
: Tests
{
83 my $matrix = gsl_matrix_alloc
(4,4);
84 map { gsl_matrix_set
($matrix, $_,$_, $_) } (0..3);
85 my $view = gsl_matrix_diagonal
($matrix);
86 my $vec = $view->swig_vector_get();
88 my @got = map { gsl_vector_get
($vec, $_) } (0..3);
89 ok_similar
( [ @got ], [ 0 .. 3 ], 'gsl_matrix_diagonal');
92 sub GSL_MATRIX_SUBDIAGONAL
: Tests
{
93 my $matrix = gsl_matrix_alloc
(4,4);
95 map { gsl_matrix_set
($matrix, $_,$_, $_) } (0..3);
97 my $view = gsl_matrix_subdiagonal
($matrix, 0);
98 my $vec = $view->swig_vector_get();
99 my @got = map { gsl_vector_get
($vec, $_) } (0..3);
100 ok_similar
( [ @got ], [ 0 .. 3 ], 'gsl_matrix_subdiagonal');
103 sub GSL_MATRIX_SWAP
: Tests
{
105 map { gsl_matrix_set
($self->{matrix
}, $_,$_, $_ ** 2) } (0..4);
106 my $matrix = gsl_matrix_alloc
(5,5);
107 map { gsl_matrix_set
($matrix, $_,$_, $_) } (0..4);
108 is
(gsl_matrix_swap
($self->{matrix
}, $matrix) ,0);
109 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, $_) } (0..4);
110 map { is
($got[$_], $_) } (0..4);
111 @got = map { gsl_matrix_get
($matrix, $_, $_) } (0..4);
112 map { is
($got[$_], $_** 2) } (0..4);
115 sub GSL_MATRIX_MEMCPY
: Tests
{
117 my $matrix = gsl_matrix_alloc
(5,5);
118 map { gsl_matrix_set
($self->{matrix
}, $_,$_, $_ ** 2) } (0..4);
119 is
(gsl_matrix_memcpy
($matrix, $self->{matrix
}), 0);
120 my @got = map { gsl_matrix_get
($matrix, $_, $_) } (0..4);
121 map { is
($got[$_], $_** 2) } (0..4);
124 sub GSL_MATRIX_SWAP_ROWS
: Tests
{
126 map { gsl_matrix_set
($self->{matrix
}, 0,$_, $_) } (0..4);
127 map { gsl_matrix_set
($self->{matrix
}, 1,$_, 3) } (0..4);
128 is
(gsl_matrix_swap_rows
($self->{matrix
}, 0, 1), 0);
129 my @got = map { gsl_matrix_get
($self->{matrix
}, 1, $_) } (0..4);
130 map { is
($got[$_], $_) } (0..4);
131 @got = map { gsl_matrix_get
($self->{matrix
}, 0, $_) } (0..4);
132 map { is
($got[$_], 3) } (0..4);
135 sub GSL_MATRIX_SWAP_COLUMNS
: Tests
{
137 map { gsl_matrix_set
($self->{matrix
}, $_,0, $_) } (0..4);
138 map { gsl_matrix_set
($self->{matrix
}, $_,1, 3) } (0..4);
139 is
(gsl_matrix_swap_columns
($self->{matrix
}, 0, 1), 0);
140 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, 1) } (0..4);
141 map { is
($got[$_], $_) } (0..4);
142 @got = map { gsl_matrix_get
($self->{matrix
}, $_, 0) } (0..4);
143 map { is
($got[$_], 3) } (0..4);
146 sub GSL_MATRIX_SWAP_ROWCOL
: Tests
{
148 map { gsl_matrix_set
($self->{matrix
}, 0,$_, $_) } (0..4);
149 map { gsl_matrix_set
($self->{matrix
}, $_,2, 2) } (0..4);
150 is
(gsl_matrix_swap_rowcol
($self->{matrix
}, 0, 2), 0);
152 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, 2) } (0..4);
153 is_deeply
( [ @got ], [ qw
/2 1 0 3 4/ ] );
155 @got = map { gsl_matrix_get
($self->{matrix
}, 0, $_) } (0..4);
156 is_deeply
( [ @got ], [ qw
/2 2 2 2 2/ ] );
159 sub GSL_MATRIX_TRANSPOSE_MEMCPY
: Tests
{
161 map { gsl_matrix_set
($self->{matrix
}, 0,$_, $_) } (0..4);
162 my $matrix = gsl_matrix_alloc
(5,5);
163 is
(gsl_matrix_transpose_memcpy
($matrix, $self->{matrix
}), 0);
164 my @got = map { gsl_matrix_get
($matrix, $_, 0) } (0..4);
165 map { is
($got[$_], $_) } (0..4);
168 sub GSL_MATRIX_TRANSPOSE
: Tests
{
170 map { gsl_matrix_set
($self->{matrix
}, 0,$_, $_) } (0..4);
171 is
(gsl_matrix_transpose
($self->{matrix
}), 0);
172 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, 0) } (0..4);
173 map { is
($got[$_], $_) } (0..4);
176 sub GSL_MATRIX_ADD
: Tests
{
178 my $matrix = gsl_matrix_alloc
(5, 5);
179 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_) } (0..4);
180 map { gsl_matrix_set
($matrix, $_, $_, $_) } (0..4);
181 is
(gsl_matrix_add
($self->{matrix
}, $matrix), 0);
182 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, $_) } (0..4);
183 map { is
($got[$_], $_*2) } (0..4);
186 sub GSL_MATRIX_SUB
: Tests
{
188 my $matrix = gsl_matrix_alloc
(5, 5);
189 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_) } (0..4);
190 map { gsl_matrix_set
($matrix, $_, $_, $_) } (0..4);
191 is
(gsl_matrix_sub
($self->{matrix
}, $matrix), 0);
192 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, $_) } (0..4);
193 map { is
($got[$_], 0) } (0..4);
196 sub GSL_MATRIX_MUL_ELEMENTS
: Tests
{
198 my $matrix = gsl_matrix_alloc
(5, 5);
199 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_) } (0..4);
200 map { gsl_matrix_set
($matrix, $_, $_, $_) } (0..4);
201 is
(gsl_matrix_mul_elements
($self->{matrix
}, $matrix), 0);
202 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, $_) } (0..4);
203 map { is
($got[$_], $_**2) } (0..4);
206 sub GSL_MATRIX_DIV_ELEMENTS
: Tests
{
208 my $matrix = gsl_matrix_alloc
(5, 5);
209 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_+1) } (0..4);
210 map { gsl_matrix_set
($matrix, $_, $_, $_+1) } (0..4);
211 is
(gsl_matrix_div_elements
($self->{matrix
}, $matrix), 0);
212 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, $_) } (0..4);
213 map { is
($got[$_], 1) } (0..4);
216 sub GSL_MATRIX_SCALE
: Tests
{
218 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_) } (0..4);
219 is
(gsl_matrix_scale
($self->{matrix
}, 4), 0);
220 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, $_) } (0..4);
221 map { is
($got[$_], $_*4) } (0..4);
224 sub GSL_MATRIX_ADD_CONSTANT
: Tests
{
226 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_) } (0..4);
227 is
(gsl_matrix_add_constant
($self->{matrix
}, 8), 0);
228 my @got = map { gsl_matrix_get
($self->{matrix
}, $_, $_) } (0..4);
229 map { is
($got[$_], $_+8) } (0..4);
232 sub GSL_MATRIX_MAX
: Tests
{
235 for($line=0; $line<5; $line++) {
236 map { gsl_matrix_set
($self->{matrix
}, $line, $_, $_**2 ) } (0..4); }
237 is
(gsl_matrix_max
($self->{matrix
}), 16);
240 sub GSL_MATRIX_MIN
: Tests
{
243 for($line=0; $line<5; $line++) {
244 map { gsl_matrix_set
($self->{matrix
}, $line, $_, $_**2 ) } (0..4); }
245 is
(gsl_matrix_min
($self->{matrix
}), 0);
248 sub GSL_MATRIX_MINMAX
: Test
{
251 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_**2) } (0..4);
252 ($min, $max) = gsl_matrix_minmax
($self->{matrix
});
253 ok_similar
( [ $min, $max ], [ 0, 16], 'gsl_matrix_minmax' );
256 sub GSL_MATRIX_MAX_INDEX
: Tests
{
260 for( $line =0; $line<4; $line++) {
261 map { gsl_matrix_set
($self->{matrix
}, $line, $_, $_) } (0..4); } # the matrix has to be clompletely filled or the function will return strange value... bug?
262 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_**2) } (0..4);
263 ($imax, $jmax) = gsl_matrix_max_index
($self->{matrix
});
264 ok_similar
( [ $imax, $jmax ], [ 4, 4 ], 'gsl_matrix_max_index' );
267 sub GSL_MATRIX_MIN_INDEX
: Tests
{
269 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_**2) } (0..4);
270 my ($imin, $jmin) = gsl_matrix_min_index
($self->{matrix
});
271 ok_similar
( [ $imin, $jmin ], [ 0, 0 ], 'gsl_matrix_min_index' );
274 sub GSL_MATRIX_ISNULL
: Tests
{
276 for my $line (0..4) {
277 map { gsl_matrix_set
($self->{matrix
}, $line, $_, 0) } (0..4);
279 is
(gsl_matrix_isnull
($self->{matrix
}), 1);
281 for my $line (0..4) {
282 map { gsl_matrix_set
($self->{matrix
}, $line, $_, $_) } (0..4);
285 is
(gsl_matrix_isnull
($self->{matrix
}), 0);
288 sub GSL_MATRIX_ISPOS
: Tests
{
292 for($line=0; $line<5; $line++) {
293 map { gsl_matrix_set
($self->{matrix
}, $line, $_, -1) } (0..4); }
294 is
(gsl_matrix_ispos
($self->{matrix
}), 0);
296 for($line=0; $line<5; $line++) {
297 map { gsl_matrix_set
($self->{matrix
}, $line, $_, 1) } (0..4); }
298 is
(gsl_matrix_ispos
($self->{matrix
}), 1);
300 for($line=0; $line<5; $line++) {
301 map { gsl_matrix_set
($self->{matrix
}, $line, $_, 0) } (0..4); }
302 is
(gsl_matrix_ispos
($self->{matrix
}), 0);
305 sub GSL_MATRIX_ISNEG
: Tests
{
309 for($line=0; $line<5; $line++) {
310 map { gsl_matrix_set
($self->{matrix
}, $line, $_, -1) } (0..4); }
311 is
(gsl_matrix_isneg
($self->{matrix
}), 1);
313 for($line=0; $line<5; $line++) {
314 map { gsl_matrix_set
($self->{matrix
}, $line, $_, 1) } (0..4); }
315 is
(gsl_matrix_isneg
($self->{matrix
}), 0);
317 for($line=0; $line<5; $line++) {
318 map { gsl_matrix_set
($self->{matrix
}, $line, $_, 0) } (0..4); }
319 is
(gsl_matrix_isneg
($self->{matrix
}), 0);
322 sub GSL_MATRIX_ISNONNEG
: Tests
{
325 map { gsl_matrix_set
($self->{matrix
}, $row, $_, -1) } (0..4);
327 is
(gsl_matrix_isnonneg
($self->{matrix
}), 0);
330 map { gsl_matrix_set
($self->{matrix
}, $row, $_, 1) } (0..4);
332 is
(gsl_matrix_isnonneg
($self->{matrix
}), 1);
335 map { gsl_matrix_set
($self->{matrix
}, $row, $_, 0) } (0..4);
337 is
(gsl_matrix_isnonneg
($self->{matrix
}), 1);
341 sub GSL_MATRIX_GET_ROW
: Tests
{
343 my $vector->{vector
} = gsl_vector_alloc
(5);
344 map { gsl_matrix_set
($self->{matrix
}, 0, $_, $_) } (0..4);
345 is
(gsl_matrix_get_row
($vector->{vector
}, $self->{matrix
}, 0), 0);
346 map { is
(gsl_vector_get
($vector->{vector
}, $_), $_) } (0..4);
349 sub GSL_MATRIX_GET_COL
: Tests
{
351 my $vector->{vector
} = gsl_vector_alloc
(5);
352 map { gsl_matrix_set
($self->{matrix
}, $_, 0, $_) } (0..4);
353 is
(gsl_matrix_get_col
($vector->{vector
}, $self->{matrix
}, 0), 0);
354 map { is
(gsl_vector_get
($vector->{vector
}, $_), $_) } (0..4);
357 sub GSL_MATRIX_SET_ROW
: Tests
{
359 my $vector->{vector
} = gsl_vector_alloc
(5);
360 map { gsl_vector_set
($vector->{vector
}, $_, $_**2) } (0..4);
361 is
(gsl_matrix_set_row
($self->{matrix
}, 1, $vector->{vector
}), 0);
363 ok_similar
( [ map { gsl_matrix_get
($self->{matrix
}, 1, $_) } (0..4) ],
364 [ map { $_ ** 2 } (0..4) ],
368 sub GSL_MATRIX_SET_COL
: Tests
{
370 my $vector->{vector
} = gsl_vector_alloc
(5);
371 map { gsl_vector_set
($vector->{vector
}, $_, $_**2) } (0..4);
372 is
(gsl_matrix_set_col
($self->{matrix
}, 1, $vector->{vector
}), 0);
374 ok_similar
( [ map { gsl_matrix_get
($self->{matrix
}, $_, 1) } (0..4) ],
375 [ map { $_ ** 2 } (0..4) ],
379 sub GSL_MATRIX_FREAD_FWRITE
: Tests
{
381 for my $line (0..4) {
382 map { gsl_matrix_set
($self->{matrix
}, $line, $_, $_**2) } (0..4);
385 my $fh = fopen
("matrix", "w");
386 is
( gsl_matrix_fwrite
($fh, $self->{matrix
}), 0);
389 for my $line (0..4) {
390 map { gsl_matrix_set
($self->{matrix
}, $line, $_, $_**3) } (0..4);
393 $fh = fopen
("matrix", "r");
395 is
(gsl_matrix_fread
($fh, $self->{matrix
}), 0);
396 for my $line (0..4) {
398 [ map { gsl_matrix_get
($self->{matrix
}, $line, $_) } (0..4) ],
399 [ map { $_**2 } (0..4) ],
405 sub GSL_MATRIX_FPRINTF_FSCANF
: Tests
{
408 for my $line (0..4) {
409 map { gsl_matrix_set
($self->{matrix
}, $line, $_, $_**2) } (0..4);
412 my $fh = fopen
("matrix", "w");
413 is
( gsl_matrix_fprintf
($fh, $self->{matrix
}, "%f"), 0);
416 for my $line (0..4) {
417 map { gsl_matrix_set
($self->{matrix
}, $line, $_, $_**3) } (0..4);
420 $fh = fopen
("matrix", "r");
422 is
(gsl_matrix_fscanf
($fh, $self->{matrix
}), 0);
423 for my $line (0..4) {
425 [ map { gsl_matrix_get
($self->{matrix
}, $line, $_) } (0..4) ],
426 [ map { $_**2 } (0..4) ],
432 sub GSL_MATRIX_MINMAX_INDEX
: Tests
{
435 for ($line = 0; $line<4; $line ++) {
436 map { gsl_matrix_set
($self->{matrix
}, $line, $_, $_) } (0..4); }
437 map { gsl_matrix_set
($self->{matrix
}, 4, $_, $_**2) } (0..4);
438 my ($imin, $jmin, $imax, $jmax) = gsl_matrix_minmax_index
($self->{matrix
});
439 ok_similar
( [ $imin, $jmin, $imax, $jmax ], [ 0, 0, 4, 4], 'gsl_matrix_minmax_index' );
442 sub GSL_MATRIX_ADD_DIAGONAL
: Tests
{
444 map { gsl_matrix_set
($self->{matrix
}, $_, $_, $_) } (0..4);
445 gsl_matrix_add_diagonal
($self->{matrix
}, 4);
446 ok_similar
( [ map { gsl_matrix_get
($self->{matrix
}, $_, $_)} (0..4) ],
451 sub GSL_MATRIX_NEW
: Tests
{
453 isa_ok
( $self->{obj
}, 'Math::GSL::Matrix' );
454 isa_ok
( $self->{obj
}->raw, 'Math::GSL::Matrix::gsl_matrix' );
455 ok
( $self->{obj
}->rows == 5, '->rows' );
456 ok
( $self->{obj
}->cols == 5, '->cols' );