1 package Math::GSL::BLAS::Test;
2 use base q{Test::Class};
3 use Test::More tests => 99;
4 use Math::GSL::BLAS qw/:all/;
5 use Math::GSL::Vector qw/:all/;
6 use Math::GSL::Complex qw/:all/;
7 use Math::GSL::Matrix qw/:all/;
8 use Math::GSL::CBLAS qw/:all/;
9 use Math::GSL qw/:all/;
10 use Math::GSL::Test qw/:all/;
11 use Math::GSL::Errno qw/:all/;
15 BEGIN { gsl_set_error_handler_off(); }
17 sub make_fixture : Test(setup) {
20 sub teardown : Test(teardown) {
23 sub GSL_BLAS_DDOT : Tests {
24 my $vec1 = Math::GSL::Vector->new([1,2,3,4,5]);
25 my $vec2 = Math::GSL::Vector->new([5,4,3,2,1]);
26 my ($x, $result) = gsl_blas_ddot($vec1->raw, $vec2->raw);
28 is_similar($result,35);
31 sub GSL_BLAS_ZDOTU : Tests {
32 my $vec1 = gsl_vector_complex_alloc(2);
33 my $vec2 = gsl_vector_complex_alloc(2);
34 my $c = gsl_complex_rect(2,1);
35 gsl_vector_complex_set($vec1,0,$c);
36 gsl_vector_complex_set($vec2,0,$c);
37 $c = gsl_complex_rect(1,1);
38 gsl_vector_complex_set($vec1,1,$c);
39 gsl_vector_complex_set($vec2,1,$c);
40 ok_status(gsl_blas_zdotu($vec1, $vec2, $c));
41 is_similar([ gsl_parts($c) ], [3,6]);
44 sub GSL_BLAS_ZDOTC : Tests {
45 my $vec1 = gsl_vector_complex_alloc(2);
46 my $vec2 = gsl_vector_complex_alloc(2);
47 my $c = gsl_complex_rect(2,1);
48 gsl_vector_complex_set($vec1,0,$c);
49 gsl_vector_complex_set($vec2,0,$c);
50 $c = gsl_complex_rect(1,1);
51 gsl_vector_complex_set($vec1,1,$c);
52 gsl_vector_complex_set($vec2,1,$c);
53 ok_status(gsl_blas_zdotc($vec1, $vec2, $c));
54 is_similar([gsl_parts($c)], [7,0]);
57 sub GSL_BLAS_DNRM2 : Tests {
58 my $vec = Math::GSL::Vector->new([3,4]);
59 is_similar(gsl_blas_dnrm2($vec->raw), 5);
63 sub GSL_BLAS_DZNRM2 : Tests {
64 my $vec = gsl_vector_complex_alloc(2);
65 my $c = gsl_complex_rect(2,1);
66 gsl_vector_complex_set($vec,0,$c);
67 $c = gsl_complex_rect(1,1);
68 gsl_vector_complex_set($vec,1,$c);
69 is_similar([gsl_blas_dznrm2($vec)], [sqrt(7)]);
72 sub GSL_BLAS_DASUM : Tests {
73 my $vec = Math::GSL::Vector->new([2,-3,4]);
74 is_similar(gsl_blas_dasum($vec->raw), 9);
77 sub GSL_BLAS_DZASUM : Tests {
78 my $vec = gsl_vector_complex_alloc(2);
79 my $c = gsl_complex_rect(2,1);
80 gsl_vector_complex_set($vec,0,$c);
81 $c = gsl_complex_rect(1,1);
82 gsl_vector_complex_set($vec,1,$c);
83 is_similar(gsl_blas_dzasum($vec), 5);
86 sub GSL_BLAS_DSWAP : Tests {
87 my $vec1 = Math::GSL::Vector->new([0,1,2]);
88 my $vec2 = Math::GSL::Vector->new([2,1,0]);
89 gsl_blas_dswap($vec1->raw, $vec2->raw);
90 ok_similar( [0 .. 2], [ $vec2->as_list ] );
91 ok_similar( [2, 1,0], [ $vec1->as_list ] );
94 sub GSL_BLAS_ZSWAP : Tests {
95 my $vec1 = gsl_vector_complex_alloc(2);
96 my $vec2 = gsl_vector_complex_alloc(2);
97 my $c = gsl_complex_rect(5,4);
98 gsl_vector_complex_set($vec1,0,$c);
99 $c = gsl_complex_rect(2,2);
100 gsl_vector_complex_set($vec1,1, $c);
101 $c = gsl_complex_rect(3,3);
102 gsl_vector_complex_set($vec2,0, $c);
103 $c = gsl_complex_rect(1,1);
104 gsl_vector_complex_set($vec2,1, $c);
106 ok_status(gsl_blas_zswap($vec1, $vec2));
107 $c = gsl_vector_complex_get($vec1,0);
108 local $TODO = "Problem with the output of gsl_vector_complex_get";
109 ok( defined $c,"gsl_vector_complex_get");
112 #is_similar( [gsl_parts($c) ], [ 3,3 ] );
115 sub GSL_BLAS_DCOPY : Tests {
116 my $vec1 = Math::GSL::Vector->new([0,1,2]);
117 my $vec2 = Math::GSL::Vector->new(3);
118 ok_status(gsl_blas_dcopy($vec1->raw, $vec2->raw));
119 ok_similar( [ $vec2->as_list ], [ 0 .. 2] );
122 sub GSL_BLAS_DAXPY : Tests {
123 my $vec1 = Math::GSL::Vector->new([0,1,2]);
124 my $vec2 = Math::GSL::Vector->new([2,3,4]);
125 ok_status(gsl_blas_daxpy(2,$vec1->raw, $vec2->raw));
126 is_similar( [ $vec2->as_list ], [ 2, 5, 8 ] );
129 sub GSL_BLAS_DSCAL : Tests {
130 my $vec = Math::GSL::Vector->new([0,1,2]);
131 gsl_blas_dscal(4, $vec->raw);
132 is_similar( [ $vec->as_list ], [0,4,8] );
135 sub GSL_BLAS_DROT : Tests {
136 my $x = Math::GSL::Vector->new([1,2,3]);
137 my $y = Math::GSL::Vector->new([0,1,2]);
138 ok_status(gsl_blas_drot($x->raw,$y->raw,2,3));
139 ok_similar( [$x->as_list], [ 2,7,12], 'first vector');
140 ok_similar( [$y->as_list], [-3,-4,-5], 'second vector');
143 sub GSL_BLAS_DGER : Tests {
144 my $x = Math::GSL::Vector->new([1,2,3]);
145 my $y = Math::GSL::Vector->new([0,1,2]);
146 my $A = Math::GSL::Matrix->new(3,3);
147 gsl_matrix_set_zero($A->raw);
148 ok_status(gsl_blas_dger(2, $x->raw, $y->raw, $A->raw));
149 ok_similar([$A->row(0)->as_list], [0,2,4]);
150 ok_similar([$A->row(1)->as_list], [0,4,8]);
151 ok_similar([$A->row(2)->as_list], [0,6,12]);
154 sub GSL_BLAS_ZGERU : Tests {
155 my $x = gsl_vector_complex_alloc(2);
156 my $y = gsl_vector_complex_alloc(2);
157 my $A = gsl_matrix_complex_alloc(2,2);
158 my $alpha = gsl_complex_rect(2,2);
159 gsl_vector_complex_set($x, 0, $alpha);
160 $alpha = gsl_complex_rect(1,2);
161 gsl_vector_complex_set($x, 1, $alpha);
162 gsl_vector_complex_set($y, 0, $alpha);
163 $alpha = gsl_complex_rect(3,2);
164 gsl_vector_complex_set($y, 1, $alpha);
165 $alpha = gsl_complex_rect(0,0);
166 for (my $line=0; $line<2; $line++) {
167 map { gsl_matrix_complex_set($A, $line, $_, $alpha) } (0..1); }
168 $alpha = gsl_complex_rect(1,0);
169 ok_status(gsl_blas_zgeru($alpha, $x, $y, $A));
171 $alpha= gsl_matrix_complex_get($A, 0,0);
172 ok_similar([gsl_parts($alpha)], [-2, 6]);
173 $alpha= gsl_matrix_complex_get($A, 1,0);
174 ok_similar([gsl_parts($alpha)], [-3, 4]);
175 $alpha= gsl_matrix_complex_get($A, 1,0);
176 ok_similar([gsl_parts($alpha)], [-3, 4]);
177 $alpha= gsl_matrix_complex_get($A, 0,1);
178 ok_similar([gsl_parts($alpha)], [2, 10]);
179 $alpha= gsl_matrix_complex_get($A, 1,1);
180 ok_similar([gsl_parts($alpha)], [-1, 8]);
183 sub GSL_BLAS_DGEMV : Tests {
184 my $x = Math::GSL::Vector->new([1,2,3]);
185 my $y = Math::GSL::Vector->new([0,1,2]);
186 my $A = Math::GSL::Matrix->new(3,3);
187 gsl_matrix_set_identity($A->raw);
188 ok_status(gsl_blas_dgemv($CblasNoTrans, 2, $A->raw, $x->raw,2, $y->raw));
189 ok_similar( [ $y->as_list ], [ 2, 6, 10 ] );
192 sub GSL_BLAS_DTRMV : Tests {
193 my $x = Math::GSL::Vector->new([1,2,3]);
194 my $A = Math::GSL::Matrix->new(3,3);
195 gsl_matrix_set($A->raw, 0,0,3);
196 gsl_matrix_set($A->raw, 1,1,3);
197 gsl_matrix_set($A->raw, 2,2,3);
198 gsl_matrix_set($A->raw, 0,1,2);
199 gsl_matrix_set($A->raw, 0,2,3);
200 gsl_matrix_set($A->raw, 1,2,4);
201 ok_status(gsl_blas_dtrmv($CblasLower, $CblasNoTrans, $CblasNonUnit, $A->raw, $x->raw));
202 is_similar( [ $x->as_list ], [ 3, 6, 9 ] );
205 sub GSL_BLAS_DTRSV : Tests {
206 my $x = Math::GSL::Vector->new([40,40,40,40]);
207 my $A = Math::GSL::Matrix->new(4,4);
208 map { gsl_matrix_set($A->raw, $_,0,$_+1); } (0..3);
209 map { gsl_matrix_set($A->raw, $_,1,$_+2); } (0..2);
210 gsl_matrix_set($A->raw, 3,1,1);
211 map { gsl_matrix_set($A->raw, $_,2,$_+3); } (0..1);
212 map { gsl_matrix_set($A->raw, $_,2,$_-1); } (2..3);
213 map { gsl_matrix_set($A->raw, $_,3,$_); } (1..3);
214 gsl_matrix_set($A->raw, 0,3,4);
215 ok_status(gsl_blas_dtrsv($CblasLower, $CblasNoTrans, $CblasNonUnit, $A->raw, $x->raw));
216 ok_similar([$x->as_list], [40,-40/3,-80/3,-160/9]);
219 sub GSL_BLAS_DROTG : Tests {
223 my ($status, $c, $s) = gsl_blas_drotg($a, $b);
224 ok_similar( [$c, $s ], [ 1/sqrt(5) , 2/sqrt(5) ] );
227 sub GSL_BLAS_DSYMV : Tests {
228 my $x = Math::GSL::Vector->new([1,2,3]);
229 my $y = Math::GSL::Vector->new([3,2,1]);
230 my $A = Math::GSL::Matrix->new(3,3);
231 map { gsl_matrix_set($A->raw, $_,0,$_+1); } (0..2);
232 gsl_matrix_set($A->raw, 0, 1, 2);
233 gsl_matrix_set($A->raw, 1, 1, 1);
234 gsl_matrix_set($A->raw, 2, 1, 2);
235 gsl_matrix_set($A->raw, 0, 2, 3);
236 gsl_matrix_set($A->raw, 1, 2, 2);
237 gsl_matrix_set($A->raw, 2, 2, 1);
238 ok_status(gsl_blas_dsymv($CblasLower, 2, $A->raw, $x->raw, 3, $y->raw));
239 ok_similar( [$y->as_list], [37,26,23]);
242 sub GSL_BLAS_DSYR : Tests {
243 my $x = Math::GSL::Vector->new([1,2,3]);
244 my $A = Math::GSL::Matrix->new(3,3);
245 gsl_matrix_set_zero($A->raw);
247 ok_status(gsl_blas_dsyr($CblasLower, 2, $x->raw, $A->raw));
248 ok_similar([ $A->row(0)->as_list ], [2,0,0]);
249 ok_similar([ $A->row(1)->as_list ], [4,8,0]);
250 ok_similar([ $A->row(2)->as_list ], [6,12,18]);
253 sub GSL_BLAS_ZHER : Tests {
254 my $x = gsl_vector_complex_alloc(2);
255 my $A = gsl_matrix_complex_alloc(2,2);
256 my $alpha = gsl_complex_rect(0,0);
258 for my $line (0 .. 1) {
259 map { gsl_matrix_complex_set($A, $_, $line, $alpha) } (0..1);
261 $alpha = gsl_complex_rect(1,2);
262 gsl_vector_complex_set($x, 0, $alpha);
263 $alpha = gsl_complex_rect(2,2);
264 gsl_vector_complex_set($x, 1, $alpha);
265 $alpha = gsl_complex_rect(1,1);
266 ok_status(gsl_blas_zher($CblasLower, 2, $x, $A));
268 ok_similar([ gsl_parts(gsl_matrix_complex_get($A,0,0)) ], [10, 0 ]);
269 ok_similar([ gsl_parts(gsl_matrix_complex_get($A,1,0)) ], [12, -4]);
270 ok_similar([ gsl_parts(gsl_matrix_complex_get($A,1,1)) ], [16, 0 ]);
271 ok_similar([ gsl_parts(gsl_matrix_complex_get($A,0,1)) ], [0 , 0 ]);
274 sub GSL_BLAS_DSYR2 : Tests {
275 my $x = Math::GSL::Vector->new([1,2,3]);
276 my $y = Math::GSL::Vector->new([3,2,1]);
277 my $A = Math::GSL::Matrix->new(3,3);
278 gsl_matrix_set_zero($A->raw);
279 map { gsl_matrix_set($A->raw, $_, 0, ($_+1)**2) } (0..2);
280 map { gsl_matrix_set($A->raw, $_, 1, ($_+1)**2) } (1..2);
281 gsl_matrix_set($A->raw, 0, 1, (1)**2);
282 gsl_matrix_set($A->raw, 0, 1, 4);
283 gsl_matrix_set($A->raw, 0, 2, 9);
284 gsl_matrix_set($A->raw, 1, 2, 9);
285 gsl_matrix_set($A->raw, 2, 2, 3);
286 ok_status(gsl_blas_dsyr2($CblasLower, 2, $x->raw, $y->raw, $A->raw));
287 my @got = $A->row(0)->as_list;
288 ok_similar([@got], [13, 4, 9]);
289 @got = $A->row(1)->as_list;
290 ok_similar([@got], [20, 20, 9]);
291 @got = $A->row(2)->as_list;
292 ok_similar([@got], [29, 25, 15]);
295 sub GSL_BLAS_DGEMM : Tests {
296 my $A = Math::GSL::Matrix->new(2,2);
297 gsl_matrix_set($A->raw, 0,0,1);
298 gsl_matrix_set($A->raw, 1,0,3);
299 gsl_matrix_set($A->raw, 0,1,4);
300 gsl_matrix_set($A->raw, 1,1,2);
301 my $B = Math::GSL::Matrix->new(2,2);
302 gsl_matrix_set($B->raw, 0,0,2);
303 gsl_matrix_set($B->raw, 1,0,5);
304 gsl_matrix_set($B->raw, 0,1,1);
305 gsl_matrix_set($B->raw, 1,1,3);
306 my $C = Math::GSL::Matrix->new(2,2);
307 gsl_matrix_set_zero($C->raw);
308 ok_status(gsl_blas_dgemm($CblasNoTrans, $CblasNoTrans, 1, $A->raw, $B->raw, 1, $C->raw));
309 my @got = $C->row(0)->as_list;
310 ok_similar([@got], [22, 13]);
311 @got = $C->row(1)->as_list;
312 ok_similar([@got], [16, 9]);
315 sub GSL_BLAS_DSYMM : Tests {
316 my $A = Math::GSL::Matrix->new(2,2);
317 gsl_matrix_set($A->raw, 0,0,1);
318 gsl_matrix_set($A->raw, 1,0,3);
319 gsl_matrix_set($A->raw, 0,1,4);
320 gsl_matrix_set($A->raw, 1,1,2);
321 my $B = Math::GSL::Matrix->new(2,2);
322 gsl_matrix_set($B->raw, 0,0,2);
323 gsl_matrix_set($B->raw, 1,0,5);
324 gsl_matrix_set($B->raw, 0,1,1);
325 gsl_matrix_set($B->raw, 1,1,3);
326 my $C = Math::GSL::Matrix->new(2,2);
327 gsl_matrix_set_zero($C->raw);
328 ok_status(gsl_blas_dsymm($CblasLeft, $CblasUpper, 1, $A->raw, $B->raw, 1, $C->raw));
329 my @got = $C->row(0)->as_list;
330 ok_similar([@got], [22, 13]);
331 @got = $C->row(1)->as_list;
332 ok_similar([@got], [18, 10]);
335 sub GSL_BLAS_ZGEMM : Tests {
336 my $A = gsl_matrix_complex_alloc(2,2);
337 my $alpha = gsl_complex_rect(1,2);
338 gsl_matrix_complex_set($A, 0,0,$alpha);
339 $alpha = gsl_complex_rect(3,1);
340 gsl_matrix_complex_set($A, 0,1,$alpha);
341 $alpha = gsl_complex_rect(2,2);
342 gsl_matrix_complex_set($A, 1,0,$alpha);
343 $alpha = gsl_complex_rect(0,2);
344 gsl_matrix_complex_set($A, 1,1,$alpha);
346 my $B = gsl_matrix_complex_alloc(2,2);
347 $alpha = gsl_complex_rect(1,1);
348 gsl_matrix_complex_set($B, 0,0,$alpha);
349 $alpha = gsl_complex_rect(2,2);
350 gsl_matrix_complex_set($B, 0,1,$alpha);
351 $alpha = gsl_complex_rect(1,2);
352 gsl_matrix_complex_set($B, 1,0,$alpha);
353 $alpha = gsl_complex_rect(1,3);
354 gsl_matrix_complex_set($B, 1,1,$alpha);
356 my $C = gsl_matrix_complex_alloc(2,2);
357 $alpha = gsl_complex_rect(0,0);
358 map { gsl_matrix_complex_set($C, 0, $_, $alpha) } (0..1);
359 map { gsl_matrix_complex_set($C, 1, $_, $alpha) } (0..1);
361 $alpha = gsl_complex_rect(2,0);
362 my $beta = gsl_complex_rect(1,0);
363 ok_status(gsl_blas_zgemm($CblasNoTrans, $CblasNoTrans, $alpha, $A, $B, $beta, $C));
364 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 0, 0))], [0,20]);
365 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 0, 1))], [-4,32]);
366 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 1, 0))], [-8,12]);
367 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 1, 1))], [-12,20]);
370 sub GSL_BLAS_ZSYMM : Tests {
371 my $A = gsl_matrix_complex_alloc(2,2);
372 my $alpha = gsl_complex_rect(1,2);
373 gsl_matrix_complex_set($A, 0,0,$alpha);
374 $alpha = gsl_complex_rect(3,1);
375 gsl_matrix_complex_set($A, 0,1,$alpha);
376 $alpha = gsl_complex_rect(3,1);
377 gsl_matrix_complex_set($A, 1,0,$alpha);
378 $alpha = gsl_complex_rect(0,2);
379 gsl_matrix_complex_set($A, 1,1,$alpha);
381 my $B = gsl_matrix_complex_alloc(2,2);
382 $alpha = gsl_complex_rect(1,1);
383 gsl_matrix_complex_set($B, 0,0,$alpha);
384 $alpha = gsl_complex_rect(2,2);
385 gsl_matrix_complex_set($B, 0,1,$alpha);
386 $alpha = gsl_complex_rect(2,2);
387 gsl_matrix_complex_set($B, 1,0,$alpha);
388 $alpha = gsl_complex_rect(1,3);
389 gsl_matrix_complex_set($B, 1,1,$alpha);
391 my $C = gsl_matrix_complex_alloc(2,2);
392 $alpha = gsl_complex_rect(0,0);
393 map { gsl_matrix_complex_set($C, 0, $_, $alpha) } (0..1);
394 map { gsl_matrix_complex_set($C, 1, $_, $alpha) } (0..1);
396 $alpha = gsl_complex_rect(2,0);
397 my $beta = gsl_complex_rect(1,0);
398 ok_status(gsl_blas_zsymm($CblasLeft, $CblasUpper, $alpha, $A, $B, $beta, $C));
399 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 0, 0))], [6,22]);
400 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 0, 1))], [-4,32]);
401 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 1, 0))], [-4,16]);
402 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 1, 1))], [-4,20]);
404 sub GSL_BLAS_ZHEMM : Tests {
405 my $A = gsl_matrix_complex_alloc(2,2);
406 my $alpha = gsl_complex_rect(3,0);
407 gsl_matrix_complex_set($A, 0,0,$alpha);
408 $alpha = gsl_complex_rect(2,1);
409 gsl_matrix_complex_set($A, 0,1,$alpha);
410 $alpha = gsl_complex_rect(2,-1);
411 gsl_matrix_complex_set($A, 1,0,$alpha);
412 $alpha = gsl_complex_rect(1,0);
413 gsl_matrix_complex_set($A, 1,1,$alpha);
415 my $B = gsl_matrix_complex_alloc(2,2);
416 $alpha = gsl_complex_rect(1,0);
417 gsl_matrix_complex_set($B, 0,0,$alpha);
418 $alpha = gsl_complex_rect(2,2);
419 gsl_matrix_complex_set($B, 0,1,$alpha);
420 $alpha = gsl_complex_rect(2,-2);
421 gsl_matrix_complex_set($B, 1,0,$alpha);
422 $alpha = gsl_complex_rect(2,0);
423 gsl_matrix_complex_set($B, 1,1,$alpha);
425 my $C = gsl_matrix_complex_alloc(2,2);
426 $alpha = gsl_complex_rect(0,0);
427 map { gsl_matrix_complex_set($C, 0, $_, $alpha) } (0..1);
428 map { gsl_matrix_complex_set($C, 1, $_, $alpha) } (0..1);
430 $alpha = gsl_complex_rect(2,0);
431 my $beta = gsl_complex_rect(1,0);
432 ok_status(gsl_blas_zhemm($CblasLeft, $CblasUpper, $alpha, $A, $B, $beta, $C));
433 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 0, 0))], [18,-4]);
434 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 0, 1))], [20,16]);
435 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 1, 0))], [8,-6]);
436 ok_similar([ gsl_parts(gsl_matrix_complex_get($C, 1, 1))], [16,4]);
439 sub GSL_BLAS_DTRMM : Tests {
440 my $A = Math::GSL::Matrix->new(2,2);
441 gsl_matrix_set($A->raw, 0,0,1);
442 gsl_matrix_set($A->raw, 1,0,3);
443 gsl_matrix_set($A->raw, 0,1,4);
444 gsl_matrix_set($A->raw, 1,1,2);
445 my $B = Math::GSL::Matrix->new(2,2);
446 gsl_matrix_set($B->raw, 0,0,2);
447 gsl_matrix_set($B->raw, 1,0,5);
448 gsl_matrix_set($B->raw, 0,1,1);
449 gsl_matrix_set($B->raw, 1,1,3);
450 my $C = Math::GSL::Matrix->new(2,2);
451 gsl_matrix_set_zero($C->raw);
452 ok_status(gsl_blas_dtrmm($CblasLeft, $CblasUpper, $CblasNoTrans, $CblasUnit, 1, $A->raw, $B->raw));
453 my @got = $B->row(0)->as_list;
454 ok_similar([@got], [22, 13]);
455 @got = $B->row(1)->as_list;
456 ok_similar([@got], [5, 3]);
459 sub GSL_BLAS_ZTRMM : Tests {
460 my $A = gsl_matrix_complex_alloc(2,2);
461 my $alpha = gsl_complex_rect(3,1);
462 gsl_matrix_complex_set($A, 0,1,$alpha);
464 my $B = gsl_matrix_complex_alloc(2,2);
465 $alpha = gsl_complex_rect(1,0);
466 gsl_matrix_complex_set($B, 0,0,$alpha);
467 $alpha = gsl_complex_rect(2,2);
468 gsl_matrix_complex_set($B, 0,1,$alpha);
469 $alpha = gsl_complex_rect(1,-2);
470 gsl_matrix_complex_set($B, 1,0,$alpha);
471 $alpha = gsl_complex_rect(4,2);
472 gsl_matrix_complex_set($B, 1,1,$alpha);
474 $alpha = gsl_complex_rect(1,0);
475 ok_status(gsl_blas_ztrmm($CblasLeft, $CblasUpper, $CblasNoTrans, $CblasUnit, $alpha, $A, $B));
476 ok_similar([gsl_parts(gsl_matrix_complex_get($B, 0, 0))], [6, -5]);
477 ok_similar([gsl_parts(gsl_matrix_complex_get($B, 0, 1))], [12, 12]);
478 ok_similar([gsl_parts(gsl_matrix_complex_get($B, 1, 0))], [1, -2]);
479 ok_similar([gsl_parts(gsl_matrix_complex_get($B, 1, 1))], [4, 2]);
482 sub GSL_BLAS_DSYRK : Tests {
483 my $A = Math::GSL::Matrix->new(2,2);
484 gsl_matrix_set($A->raw, 0, 0, 1);
485 gsl_matrix_set($A->raw, 0, 1, 4);
486 gsl_matrix_set($A->raw, 1, 0, 4);
487 gsl_matrix_set($A->raw, 1, 1, 3);
488 my $C = Math::GSL::Matrix->new(2,2);
489 gsl_matrix_set_zero($C->raw);
490 ok_status(gsl_blas_dsyrk ($CblasUpper, $CblasNoTrans, 1, $A->raw, 1, $C->raw));
491 ok_similar([$C->row(0)->as_list], [17,16]);
492 ok_similar([$C->row(1)->as_list], [0,25]);
495 sub GSL_BLAS_ZSYRK : Tests {
496 my $A = gsl_matrix_complex_alloc(2,2);
497 my $alpha = gsl_complex_rect(3,1);
498 gsl_matrix_complex_set($A, 0,0,$alpha);
499 $alpha = gsl_complex_rect(2,1);
500 gsl_matrix_complex_set($A, 0,1,$alpha);
501 gsl_matrix_complex_set($A, 1,0,$alpha);
502 $alpha = gsl_complex_rect(1,1);
503 gsl_matrix_complex_set($A, 1,1,$alpha);
505 my $C = gsl_matrix_complex_alloc(2,2);
506 $alpha = gsl_complex_rect(0,0);
507 map { gsl_matrix_complex_set($C, 0,$_,$alpha) } (0..1);
508 map { gsl_matrix_complex_set($C, 1,$_,$alpha) } (0..1);
510 $alpha = gsl_complex_rect(1,0);
511 my $beta = gsl_complex_rect(1,0);
512 ok_status(gsl_blas_zsyrk($CblasUpper, $CblasNoTrans, $alpha, $A, $beta, $C));
513 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 0, 0))], [11, 10]);
514 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 0, 1))], [6, 8]);
515 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 1, 0))], [0, 0]);
516 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 1, 1))], [3, 6]);
519 sub GSL_BLAS_ZHERK : Tests {
520 my $A = gsl_matrix_complex_alloc(2,2);
521 my $alpha = gsl_complex_rect(3,0);
522 gsl_matrix_complex_set($A, 0,0,$alpha);
523 $alpha = gsl_complex_rect(2,1);
524 gsl_matrix_complex_set($A, 0,1,$alpha);
525 $alpha = gsl_complex_rect(2,-1);
526 gsl_matrix_complex_set($A, 1,0,$alpha);
527 $alpha = gsl_complex_rect(1,0);
528 gsl_matrix_complex_set($A, 1,1,$alpha);
530 my $C = gsl_matrix_complex_alloc(2,2);
531 $alpha = gsl_complex_rect(0,0);
532 map { gsl_matrix_complex_set($C, 0,$_,$alpha) } (0..1);
533 map { gsl_matrix_complex_set($C, 1,$_,$alpha) } (0..1);
535 ok_status(gsl_blas_zherk ($CblasUpper, $CblasNoTrans, 1, $A, 1, $C));
536 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 0, 0))], [14, 0]);
537 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 0, 1))], [8, 4]);
538 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 1, 0))], [0, 0]);
539 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 1, 1))], [6, 0]);
542 sub GSL_BLAS_ZHER2K : Tests {
543 my $A = gsl_matrix_complex_alloc(2,2);
544 my $alpha = gsl_complex_rect(3,0);
545 gsl_matrix_complex_set($A, 0,0,$alpha);
546 $alpha = gsl_complex_rect(2,1);
547 gsl_matrix_complex_set($A, 0,1,$alpha);
548 $alpha = gsl_complex_rect(2,-1);
549 gsl_matrix_complex_set($A, 1,0,$alpha);
550 $alpha = gsl_complex_rect(1,0);
551 gsl_matrix_complex_set($A, 1,1,$alpha);
553 my $B = gsl_matrix_complex_alloc(2,2);
554 $alpha = gsl_complex_rect(6,0);
555 gsl_matrix_complex_set($A, 0,0,$alpha);
556 $alpha = gsl_complex_rect(3,1);
557 gsl_matrix_complex_set($A, 0,1,$alpha);
558 $alpha = gsl_complex_rect(3,-1);
559 gsl_matrix_complex_set($A, 1,0,$alpha);
560 $alpha = gsl_complex_rect(5,0);
561 gsl_matrix_complex_set($A, 1,1,$alpha);
563 my $C = gsl_matrix_complex_alloc(2,2);
564 $alpha = gsl_complex_rect(0,0);
565 map { gsl_matrix_complex_set($C, 0,$_,$alpha) } (0..1);
566 map { gsl_matrix_complex_set($C, 1,$_,$alpha) } (0..1);
568 $alpha = gsl_complex_rect(1,0);
570 ok_status(gsl_blas_zher2k($CblasUpper, $CblasNoTrans, $alpha, $A, $B, 1, $C));
571 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 1, 0))], [0, 0]);
572 local $TODO = "These results follow the formula given by the documentation, don't know why it fails";
573 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 0, 0))], [50, 0]);
574 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 0, 1))], [34, 15]);
575 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 1, 1))], [24, 0]);
578 sub GSL_BLAS_DSYR2K : Tests {
579 my $A = Math::GSL::Matrix->new(2,2);
580 gsl_matrix_set($A->raw, 0, 0, 1);
581 gsl_matrix_set($A->raw, 0, 1, 4);
582 gsl_matrix_set($A->raw, 1, 0, 4);
583 gsl_matrix_set($A->raw, 1, 1, 3);
584 my $B = Math::GSL::Matrix->new(2,2);
585 gsl_matrix_set($B->raw, 0, 0, 2);
586 gsl_matrix_set($B->raw, 0, 1, 5);
587 gsl_matrix_set($B->raw, 1, 0, 5);
588 gsl_matrix_set($B->raw, 1, 1, 1);
589 my $C = Math::GSL::Matrix->new(2,2);
590 gsl_matrix_set_zero($C->raw);
591 ok_status(gsl_blas_dsyr2k ($CblasUpper, $CblasNoTrans, 1, $A->raw, $B->raw, 1, $C->raw, ));
592 ok_similar([$C->row(0)->as_list], [44,32]);
593 ok_similar([$C->row(1)->as_list], [0,46]);
596 sub GSL_BLAS_ZSYR2K : Tests {
597 my $A = gsl_matrix_complex_alloc(2,2);
598 my $alpha = gsl_complex_rect(3,0);
599 gsl_matrix_complex_set($A, 0,0,$alpha);
600 $alpha = gsl_complex_rect(2,1);
601 gsl_matrix_complex_set($A, 0,1,$alpha);
602 $alpha = gsl_complex_rect(2,1);
603 gsl_matrix_complex_set($A, 1,0,$alpha);
604 $alpha = gsl_complex_rect(1,0);
605 gsl_matrix_complex_set($A, 1,1,$alpha);
607 my $B = gsl_matrix_complex_alloc(2,2);
608 $alpha = gsl_complex_rect(6,0);
609 gsl_matrix_complex_set($A, 0,0,$alpha);
610 $alpha = gsl_complex_rect(3,1);
611 gsl_matrix_complex_set($A, 0,1,$alpha);
612 $alpha = gsl_complex_rect(3,1);
613 gsl_matrix_complex_set($A, 1,0,$alpha);
614 $alpha = gsl_complex_rect(5,0);
615 gsl_matrix_complex_set($A, 1,1,$alpha);
617 my $C = gsl_matrix_complex_alloc(2,2);
618 $alpha = gsl_complex_rect(0,0);
619 map { gsl_matrix_complex_set($C, 0,$_,$alpha) } (0..1);
620 map { gsl_matrix_complex_set($C, 1,$_,$alpha) } (0..1);
622 $alpha = gsl_complex_rect(1,0);
623 my $beta = gsl_complex_rect(1,0);
625 ok_status(gsl_blas_zsyr2k($CblasUpper, $CblasNoTrans, $alpha, $A, $B, $beta, $C));
626 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 1, 0))], [0, 0]);
627 local $TODO = "These results follow the formula given by the documentation, don't know why it fails";
628 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 0, 0))], [46, 10]);
629 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 0, 1))], [34, 15]);
630 ok_similar([gsl_parts(gsl_matrix_complex_get($C, 1, 1))], [24, 4]);
633 Test::Class->runtests;