Implemented swap() for VecorComplex objects
[Math-GSL.git] / t / BLAS.t
blob004b2c433df1e5d3cf0231c633a63ef17cdee87b
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/;
12 use Data::Dumper;
13 use strict;
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);
27     ok_status($x);
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);
61   
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");  
111     # goes boom
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));
170     
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 {
220     my $a = [1];
221     my $b = [2];
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); 
260     }  
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);
395     
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);
429     
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);
473     
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);
509     
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);
562     
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);
616     
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;