kmat 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rspec +1 -0
- data/CHANGELOG.md +10 -0
- data/README.md +11 -11
- data/ext/kmat/arith/binary.c +161 -139
- data/ext/kmat/arith/math.c +1 -1
- data/ext/kmat/arith/statistics.c +11 -11
- data/ext/kmat/arith/unary.c +6 -6
- data/ext/kmat/extconf.rb +3 -0
- data/ext/kmat/km_util.h +34 -13
- data/ext/kmat/kmat.h +3 -3
- data/ext/kmat/linalg/dla.c +185 -133
- data/ext/kmat/linalg/linalg.c +33 -17
- data/ext/kmat/linalg/norm.c +83 -69
- data/ext/kmat/linalg/vla.c +23 -23
- data/ext/kmat/linalg/working.c +42 -38
- data/ext/kmat/main.c +4 -4
- data/ext/kmat/smat/accessor.c +104 -104
- data/ext/kmat/smat/array.c +3 -3
- data/ext/kmat/smat/boxmuller.c +5 -5
- data/ext/kmat/smat/constructer.c +52 -52
- data/ext/kmat/smat/convert.c +21 -21
- data/ext/kmat/smat/elem.c +7 -7
- data/ext/kmat/smat/fund.c +37 -37
- data/ext/kmat/smat/share.c +28 -27
- data/ext/kmat/smat/smat.c +58 -42
- data/ext/kmat/smat/sort.c +148 -146
- data/kmat.gemspec +5 -4
- data/lib/kmat/accessor.rb +5 -5
- data/lib/kmat/linalg.rb +1 -2
- data/lib/kmat/random.rb +2 -2
- data/lib/kmat/version.rb +1 -1
- data/lib/kmat.rb +9 -9
- metadata +25 -10
data/ext/kmat/arith/binary.c
CHANGED
@@ -37,44 +37,46 @@ kmm_mat_add_destl(VALUE self, VALUE other)
|
|
37
37
|
CHECK_SAME_SIZE(sy, sx);
|
38
38
|
if ( sy->vtype == VT_DOUBLE ) {
|
39
39
|
if ( sy->stype == ST_FULL && sx->stype == ST_FULL && sy->trans == sx->trans ) {
|
40
|
-
double alpha = 1.0; int len =
|
40
|
+
const double alpha = 1.0; const int len = LENGTHi(sy), ione=1;
|
41
41
|
daxpy_(&len, &alpha, sx->dbody, &ione, sy->dbody, &ione);
|
42
42
|
} else if ( sy->stype != ST_RSUB && sx->stype != ST_RSUB ) {
|
43
|
-
double alpha = 1.0; int incy, stepy,
|
43
|
+
const double alpha = 1.0; int incy, incx; size_t stepy, stepx;
|
44
44
|
if ( sy->trans ) {
|
45
|
-
incy = sy->ld; stepy = 1;
|
45
|
+
incy = s2i(sy->ld); stepy = 1;
|
46
46
|
} else {
|
47
47
|
incy = 1; stepy = sy->ld;
|
48
48
|
}
|
49
49
|
if ( sx->trans ) {
|
50
|
-
incx = sx->ld; stepx = 1;
|
50
|
+
incx = s2i(sx->ld); stepx = 1;
|
51
51
|
} else {
|
52
52
|
incx = 1; stepx = sx->ld;
|
53
53
|
}
|
54
|
-
|
55
|
-
|
54
|
+
const int m=s2i(sy->m);
|
55
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
56
|
+
daxpy_(&m, &alpha, (sx->dbody)+(i*stepx), &incx, (sy->dbody)+(i*stepy), &incy);
|
56
57
|
}
|
57
58
|
} else {
|
58
59
|
km_smat_each2_d(sy, sx, km_add_d, NULL);
|
59
60
|
}
|
60
61
|
} else if ( sy->vtype == VT_COMPLEX ) {
|
61
62
|
if ( sy->stype == ST_FULL && sx->stype == ST_FULL && sy->trans == sx->trans ) {
|
62
|
-
COMPLEX alpha = cpack(1.0, 0.0); int len =
|
63
|
+
const COMPLEX alpha = cpack(1.0, 0.0); int len = LENGTHi(sy), ione=1;
|
63
64
|
zaxpy_(&len, &alpha, sx->zbody, &ione, sy->zbody, &ione);
|
64
65
|
} else if ( sy->stype != ST_RSUB && sx->stype != ST_RSUB ) {
|
65
|
-
COMPLEX alpha = cpack(1.0, 0.0); int incy, stepy,
|
66
|
+
const COMPLEX alpha = cpack(1.0, 0.0); int incy, incx; size_t stepy, stepx;
|
66
67
|
if ( sy->trans ) {
|
67
|
-
incy = sy->ld; stepy = 1;
|
68
|
+
incy = s2i(sy->ld); stepy = 1;
|
68
69
|
} else {
|
69
70
|
incy = 1; stepy = sy->ld;
|
70
71
|
}
|
71
72
|
if ( sx->trans ) {
|
72
|
-
incx = sx->ld; stepx = 1;
|
73
|
+
incx = s2i(sx->ld); stepx = 1;
|
73
74
|
} else {
|
74
75
|
incx = 1; stepx = sx->ld;
|
75
76
|
}
|
76
|
-
|
77
|
-
|
77
|
+
const int m=s2i(sy->m);
|
78
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
79
|
+
zaxpy_(&m, &alpha, (sx->zbody)+(i*stepx), &incx, (sy->zbody)+(i*stepy), &incy);
|
78
80
|
}
|
79
81
|
} else {
|
80
82
|
km_smat_each2_z(sy, sx, km_add_z, NULL);
|
@@ -122,44 +124,46 @@ kmm_mat_sub_destl(VALUE self, VALUE other)
|
|
122
124
|
CHECK_SAME_SIZE(sy, sx);
|
123
125
|
if ( sy->vtype == VT_DOUBLE ) {
|
124
126
|
if ( sy->stype == ST_FULL && sx->stype == ST_FULL && sy->trans == sx->trans ) {
|
125
|
-
double alpha = -1.0; int len =
|
127
|
+
const double alpha = -1.0; const int len = LENGTHi(sy), ione=1;
|
126
128
|
daxpy_(&len, &alpha, sx->dbody, &ione, sy->dbody, &ione);
|
127
129
|
} else if ( sy->stype != ST_RSUB && sx->stype != ST_RSUB ) {
|
128
|
-
double alpha = -1.0; int incy, stepy,
|
130
|
+
const double alpha = -1.0; int incy, incx; size_t stepy, stepx;
|
129
131
|
if ( sy->trans ) {
|
130
|
-
incy = sy->ld; stepy = 1;
|
132
|
+
incy = s2i(sy->ld); stepy = 1;
|
131
133
|
} else {
|
132
134
|
incy = 1; stepy = sy->ld;
|
133
135
|
}
|
134
136
|
if ( sx->trans ) {
|
135
|
-
incx = sx->ld; stepx = 1;
|
137
|
+
incx = s2i(sx->ld); stepx = 1;
|
136
138
|
} else {
|
137
139
|
incx = 1; stepx = sx->ld;
|
138
140
|
}
|
139
|
-
|
140
|
-
|
141
|
+
const int m=s2i(sy->m);
|
142
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
143
|
+
daxpy_(&m, &alpha, (sx->dbody)+(i*stepx), &incx, (sy->dbody)+(i*stepy), &incy);
|
141
144
|
}
|
142
145
|
} else {
|
143
146
|
km_smat_each2_d(sy, sx, km_sub_d, NULL);
|
144
147
|
}
|
145
148
|
} else if ( sy->vtype == VT_COMPLEX ) {
|
146
149
|
if ( sy->stype == ST_FULL && sx->stype == ST_FULL && sy->trans == sx->trans ) {
|
147
|
-
COMPLEX alpha = cpack(-1.0, 0.0); int len =
|
150
|
+
const COMPLEX alpha = cpack(-1.0, 0.0); const int len = LENGTHi(sy), ione=1;
|
148
151
|
zaxpy_(&len, &alpha, sx->zbody, &ione, sy->zbody, &ione);
|
149
152
|
} else if ( sy->stype != ST_RSUB && sx->stype != ST_RSUB ) {
|
150
|
-
COMPLEX alpha = cpack(-1.0, 0.0); int incy, stepy,
|
153
|
+
const COMPLEX alpha = cpack(-1.0, 0.0); int incy, incx; size_t stepy, stepx;
|
151
154
|
if ( sy->trans ) {
|
152
|
-
incy = sy->ld; stepy = 1;
|
155
|
+
incy = s2i(sy->ld); stepy = 1;
|
153
156
|
} else {
|
154
157
|
incy = 1; stepy = sy->ld;
|
155
158
|
}
|
156
159
|
if ( sx->trans ) {
|
157
|
-
incx = sx->ld; stepx = 1;
|
160
|
+
incx = s2i(sx->ld); stepx = 1;
|
158
161
|
} else {
|
159
162
|
incx = 1; stepx = sx->ld;
|
160
163
|
}
|
161
|
-
|
162
|
-
|
164
|
+
const int m=s2i(sy->m);
|
165
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
166
|
+
zaxpy_(&m, &alpha, (sx->zbody)+(i*stepx), &incx, (sy->zbody)+(i*stepy), &incy);
|
163
167
|
}
|
164
168
|
} else {
|
165
169
|
km_smat_each2_z(sy, sx, km_sub_z, NULL);
|
@@ -283,31 +287,31 @@ kmm_mat_e_div_destl(VALUE self, VALUE other)
|
|
283
287
|
static void
|
284
288
|
km_s_add_d(double *ent, void *data)
|
285
289
|
{
|
286
|
-
double *val = (double *)data;
|
290
|
+
const double *val = (double *)data;
|
287
291
|
*ent += *val;
|
288
292
|
}
|
289
293
|
static void
|
290
294
|
km_s_add_z(COMPLEX *ent, void *data)
|
291
295
|
{
|
292
|
-
COMPLEX *val = (COMPLEX *)data;
|
296
|
+
const COMPLEX *val = (COMPLEX *)data;
|
293
297
|
*ent += *val;
|
294
298
|
}
|
295
299
|
static void
|
296
300
|
km_s_add_i(int *ent, void *data)
|
297
301
|
{
|
298
|
-
int *val = (int *)data;
|
302
|
+
const int *val = (int *)data;
|
299
303
|
*ent += *val;
|
300
304
|
}
|
301
305
|
static void
|
302
306
|
km_s_add_b(bool *ent, void *data)
|
303
307
|
{
|
304
|
-
bool *val = (bool *)data;
|
308
|
+
const bool *val = (bool *)data;
|
305
309
|
*ent = XOR(*ent, *val);
|
306
310
|
}
|
307
311
|
static void
|
308
312
|
km_s_add_v(VALUE *ent, void *data)
|
309
313
|
{
|
310
|
-
VALUE val = (VALUE)data;
|
314
|
+
const VALUE val = (VALUE)data;
|
311
315
|
*ent = rb_funcall(*ent, id_op_plus, 1, val);
|
312
316
|
}
|
313
317
|
VALUE
|
@@ -316,52 +320,56 @@ kmm_mat_s_add_destl(VALUE self, VALUE vval)
|
|
316
320
|
km_check_frozen(self);
|
317
321
|
SMAT *sy = km_mat2smat(self);
|
318
322
|
if ( sy->vtype == VT_DOUBLE ) {
|
319
|
-
double val = NUM2DBL(vval);
|
323
|
+
const double val = NUM2DBL(vval);
|
320
324
|
if ( sy->stype == ST_FULL ) {
|
321
|
-
double alpha=1.0;
|
322
|
-
int len=
|
325
|
+
const double alpha=1.0;
|
326
|
+
const int len=LENGTHi(sy), ione=1, izero=0;
|
323
327
|
daxpy_(&len, &alpha, &val, &izero, sy->dbody, &ione);
|
324
328
|
} else if ( sy->stype == ST_SSUB ) {
|
325
|
-
double alpha=1.0;
|
326
|
-
int ione=1, izero=0;
|
329
|
+
const double alpha=1.0;
|
330
|
+
const int ione=1, izero=0;
|
327
331
|
if ( sy->trans ) {
|
328
|
-
|
329
|
-
|
332
|
+
const int n=s2i(sy->n);
|
333
|
+
for ( size_t i=0; i<(sy->m); i++ ) {
|
334
|
+
daxpy_(&n, &alpha, &val, &izero, (sy->dbody)+(i*(sy->ld)), &ione);
|
330
335
|
}
|
331
336
|
} else {
|
332
|
-
|
333
|
-
|
337
|
+
const int m=s2i(sy->m);
|
338
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
339
|
+
daxpy_(&m, &alpha, &val, &izero, (sy->dbody)+(i*(sy->ld)), &ione);
|
334
340
|
}
|
335
341
|
}
|
336
342
|
} else {
|
337
343
|
km_smat_each_d(sy, km_s_add_d, (void *)&val);
|
338
344
|
}
|
339
345
|
} else if ( sy->vtype == VT_COMPLEX ) {
|
340
|
-
COMPLEX val = km_v2c(vval);
|
346
|
+
const COMPLEX val = km_v2c(vval);
|
341
347
|
if ( sy->stype == ST_FULL ) {
|
342
|
-
COMPLEX alpha=cpack(1.0, 0.0);
|
343
|
-
int len=
|
348
|
+
const COMPLEX alpha=cpack(1.0, 0.0);
|
349
|
+
const int len=LENGTHi(sy), ione=1, izero=0;
|
344
350
|
zaxpy_(&len, &alpha, &val, &izero, sy->zbody, &ione);
|
345
351
|
} else if ( sy->stype == ST_SSUB ) {
|
346
|
-
COMPLEX alpha=cpack(1.0, 0.0);
|
347
|
-
int ione=1, izero=0;
|
352
|
+
const COMPLEX alpha=cpack(1.0, 0.0);
|
353
|
+
const int ione=1, izero=0;
|
348
354
|
if ( sy->trans ) {
|
349
|
-
|
350
|
-
|
355
|
+
const int n=s2i(sy->n);
|
356
|
+
for ( size_t i=0; i<(sy->m); i++ ) {
|
357
|
+
zaxpy_(&n, &alpha, &val, &izero, (sy->zbody)+(i*(sy->ld)), &ione);
|
351
358
|
}
|
352
359
|
} else {
|
353
|
-
|
354
|
-
|
360
|
+
const int m=s2i(sy->m);
|
361
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
362
|
+
zaxpy_(&m, &alpha, &val, &izero, (sy->zbody)+(i*(sy->ld)), &ione);
|
355
363
|
}
|
356
364
|
}
|
357
365
|
} else {
|
358
366
|
km_smat_each_z(sy, km_s_add_z, (void *)&val);
|
359
367
|
}
|
360
368
|
} else if ( sy->vtype == VT_INT ) {
|
361
|
-
int val = NUM2INT(vval);
|
369
|
+
const int val = NUM2INT(vval);
|
362
370
|
km_smat_each_i(sy, km_s_add_i, (void *)&val);
|
363
371
|
} else if ( sy->vtype == VT_BOOL ) {
|
364
|
-
bool val = RTEST(vval);
|
372
|
+
const bool val = RTEST(vval);
|
365
373
|
km_smat_each_b(sy, km_s_add_b, (void *)&val);
|
366
374
|
} else if ( sy->vtype == VT_VALUE ) {
|
367
375
|
km_smat_each_v(sy, km_s_add_v, (void *)vval);
|
@@ -374,25 +382,25 @@ kmm_mat_s_add_destl(VALUE self, VALUE vval)
|
|
374
382
|
static void
|
375
383
|
km_s_sub_d(double *ent, void *data)
|
376
384
|
{
|
377
|
-
double *val = (double *)data;
|
385
|
+
const double *val = (double *)data;
|
378
386
|
*ent -= *val;
|
379
387
|
}
|
380
388
|
static void
|
381
389
|
km_s_sub_z(COMPLEX *ent, void *data)
|
382
390
|
{
|
383
|
-
COMPLEX *val = (COMPLEX *)data;
|
391
|
+
const COMPLEX *val = (COMPLEX *)data;
|
384
392
|
*ent -= *val;
|
385
393
|
}
|
386
394
|
static void
|
387
395
|
km_s_sub_i(int *ent, void *data)
|
388
396
|
{
|
389
|
-
int *val = (int *)data;
|
397
|
+
const int *val = (int *)data;
|
390
398
|
*ent -= *val;
|
391
399
|
}
|
392
400
|
static void
|
393
401
|
km_s_sub_v(VALUE *ent, void *data)
|
394
402
|
{
|
395
|
-
VALUE val = (VALUE)data;
|
403
|
+
const VALUE val = (VALUE)data;
|
396
404
|
*ent = rb_funcall(*ent, id_op_minus, 1, val);
|
397
405
|
}
|
398
406
|
VALUE
|
@@ -403,50 +411,54 @@ kmm_mat_s_sub_destl(VALUE self, VALUE vval)
|
|
403
411
|
if ( sy->vtype == VT_DOUBLE ) {
|
404
412
|
double val = NUM2DBL(vval);
|
405
413
|
if ( sy->stype == ST_FULL ) {
|
406
|
-
double alpha=-1.0;
|
407
|
-
int len=
|
414
|
+
const double alpha=-1.0;
|
415
|
+
const int len=LENGTHi(sy), ione=1, izero=0;
|
408
416
|
daxpy_(&len, &alpha, &val, &izero, sy->dbody, &ione);
|
409
417
|
} else if ( sy->stype == ST_SSUB ) {
|
410
|
-
double alpha=-1.0;
|
411
|
-
int ione=1, izero=0;
|
418
|
+
const double alpha=-1.0;
|
419
|
+
const int ione=1, izero=0;
|
412
420
|
if ( sy->trans ) {
|
413
|
-
|
414
|
-
|
421
|
+
const int n=s2i(sy->n);
|
422
|
+
for ( size_t i=0; i<(sy->m); i++ ) {
|
423
|
+
daxpy_(&n, &alpha, &val, &izero, (sy->dbody)+(i*(sy->ld)), &ione);
|
415
424
|
}
|
416
425
|
} else {
|
417
|
-
|
418
|
-
|
426
|
+
const int m=s2i(sy->m);
|
427
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
428
|
+
daxpy_(&m, &alpha, &val, &izero, (sy->dbody)+(i*(sy->ld)), &ione);
|
419
429
|
}
|
420
430
|
}
|
421
431
|
} else {
|
422
432
|
km_smat_each_d(sy, km_s_sub_d, (void *)&val);
|
423
433
|
}
|
424
434
|
} else if ( sy->vtype == VT_COMPLEX ) {
|
425
|
-
COMPLEX val = km_v2c(vval);
|
435
|
+
const COMPLEX val = km_v2c(vval);
|
426
436
|
if ( sy->stype == ST_FULL ) {
|
427
|
-
COMPLEX alpha=cpack(-1.0, 0.0);
|
428
|
-
int len=
|
437
|
+
const COMPLEX alpha=cpack(-1.0, 0.0);
|
438
|
+
const int len=LENGTHi(sy), ione=1, izero=0;
|
429
439
|
zaxpy_(&len, &alpha, &val, &izero, sy->zbody, &ione);
|
430
440
|
} else if ( sy->stype == ST_SSUB ) {
|
431
|
-
COMPLEX alpha=cpack(-1.0, 0.0);
|
432
|
-
int ione=1, izero=0;
|
441
|
+
const COMPLEX alpha=cpack(-1.0, 0.0);
|
442
|
+
const int ione=1, izero=0;
|
433
443
|
if ( sy->trans ) {
|
434
|
-
|
435
|
-
|
444
|
+
const int n=s2i(sy->n);
|
445
|
+
for ( size_t i=0; i<(sy->m); i++ ) {
|
446
|
+
zaxpy_(&n, &alpha, &val, &izero, (sy->zbody)+(i*(sy->ld)), &ione);
|
436
447
|
}
|
437
448
|
} else {
|
438
|
-
|
439
|
-
|
449
|
+
const int m=s2i(sy->m);
|
450
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
451
|
+
zaxpy_(&m, &alpha, &val, &izero, (sy->zbody)+(i*(sy->ld)), &ione);
|
440
452
|
}
|
441
453
|
}
|
442
454
|
} else {
|
443
455
|
km_smat_each_z(sy, km_s_sub_z, (void *)&val);
|
444
456
|
}
|
445
457
|
} else if ( sy->vtype == VT_INT ) {
|
446
|
-
int val = NUM2INT(vval);
|
458
|
+
const int val = NUM2INT(vval);
|
447
459
|
km_smat_each_i(sy, km_s_sub_i, (void *)&val);
|
448
460
|
} else if ( sy->vtype == VT_BOOL ) {
|
449
|
-
bool val = RTEST(vval);
|
461
|
+
const bool val = RTEST(vval);
|
450
462
|
km_smat_each_b(sy, km_s_add_b, (void *)&val); // subtract is the same as add for boolean
|
451
463
|
} else if ( sy->vtype == VT_VALUE ) {
|
452
464
|
km_smat_each_v(sy, km_s_sub_v, (void *)vval);
|
@@ -460,25 +472,25 @@ kmm_mat_s_sub_destl(VALUE self, VALUE vval)
|
|
460
472
|
static void
|
461
473
|
km_s_mul_d(double *ent, void *data)
|
462
474
|
{
|
463
|
-
double *val = (double *)data;
|
475
|
+
const double *val = (double *)data;
|
464
476
|
*ent *= *val;
|
465
477
|
}
|
466
478
|
static void
|
467
479
|
km_s_mul_z(COMPLEX *ent, void *data)
|
468
480
|
{
|
469
|
-
COMPLEX *val = (COMPLEX *)data;
|
481
|
+
const COMPLEX *val = (COMPLEX *)data;
|
470
482
|
*ent *= *val;
|
471
483
|
}
|
472
484
|
static void
|
473
485
|
km_s_mul_i(int *ent, void *data)
|
474
486
|
{
|
475
|
-
int *val = (int *)data;
|
487
|
+
const int *val = (int *)data;
|
476
488
|
*ent *= *val;
|
477
489
|
}
|
478
490
|
static void
|
479
491
|
km_s_mul_v(VALUE *ent, void *data)
|
480
492
|
{
|
481
|
-
VALUE val = (VALUE)data;
|
493
|
+
const VALUE val = (VALUE)data;
|
482
494
|
*ent = rb_funcall(*ent, id_op_mul, 1, val);
|
483
495
|
}
|
484
496
|
VALUE
|
@@ -487,45 +499,49 @@ kmm_mat_s_mul_destl(VALUE self, VALUE vval)
|
|
487
499
|
km_check_frozen(self);
|
488
500
|
SMAT *sy = km_mat2smat(self);
|
489
501
|
if ( sy->vtype == VT_DOUBLE ) {
|
490
|
-
double val = NUM2DBL(vval);
|
502
|
+
const double val = NUM2DBL(vval);
|
491
503
|
if ( sy->stype == ST_FULL ) {
|
492
|
-
int len=
|
504
|
+
const int len=LENGTHi(sy), ione=1;
|
493
505
|
dscal_(&len, &val, sy->dbody, &ione);
|
494
506
|
} else if ( sy->stype == ST_SSUB ) {
|
495
|
-
int ione=1;
|
507
|
+
const int ione=1;
|
496
508
|
if ( sy->trans ) {
|
497
|
-
|
498
|
-
|
509
|
+
const int n=s2i(sy->n);
|
510
|
+
for ( size_t i=0; i<(sy->m); i++ ) {
|
511
|
+
dscal_(&n, &val, (sy->dbody)+(i*(sy->ld)), &ione);
|
499
512
|
}
|
500
513
|
} else {
|
501
|
-
|
502
|
-
|
514
|
+
const int m=s2i(sy->m);
|
515
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
516
|
+
dscal_(&m, &val, (sy->dbody)+(i*(sy->ld)), &ione);
|
503
517
|
}
|
504
518
|
}
|
505
519
|
} else {
|
506
520
|
km_smat_each_d(sy, km_s_mul_d, (void *)&val);
|
507
521
|
}
|
508
522
|
} else if ( sy->vtype == VT_COMPLEX ) {
|
509
|
-
COMPLEX val = km_v2c(vval);
|
523
|
+
const COMPLEX val = km_v2c(vval);
|
510
524
|
if ( sy->stype == ST_FULL ) {
|
511
|
-
int len=
|
525
|
+
const int len=LENGTHi(sy), ione=1;
|
512
526
|
zscal_(&len, &val, sy->zbody, &ione);
|
513
527
|
} else if ( sy->stype == ST_SSUB ) {
|
514
|
-
int ione=1;
|
528
|
+
const int ione=1;
|
515
529
|
if ( sy->trans ) {
|
516
|
-
|
517
|
-
|
530
|
+
const int n=s2i(sy->n);
|
531
|
+
for ( size_t i=0; i<(sy->m); i++ ) {
|
532
|
+
zscal_(&n, &val, (sy->zbody)+(i*(sy->ld)), &ione);
|
518
533
|
}
|
519
534
|
} else {
|
520
|
-
|
521
|
-
|
535
|
+
const int m=s2i(sy->m);
|
536
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
537
|
+
zscal_(&m, &val, (sy->zbody)+(i*(sy->ld)), &ione);
|
522
538
|
}
|
523
539
|
}
|
524
540
|
} else {
|
525
541
|
km_smat_each_z(sy, km_s_mul_z, (void *)&val);
|
526
542
|
}
|
527
543
|
} else if ( sy->vtype == VT_INT ) {
|
528
|
-
int val = NUM2INT(vval);
|
544
|
+
const int val = NUM2INT(vval);
|
529
545
|
km_smat_each_i(sy, km_s_mul_i, (void *)&val);
|
530
546
|
} else if ( sy->vtype == VT_BOOL ) {
|
531
547
|
if ( RTEST(vval) ) {
|
@@ -544,13 +560,13 @@ kmm_mat_s_mul_destl(VALUE self, VALUE vval)
|
|
544
560
|
static void
|
545
561
|
km_s_div_i(int *ent, void *data)
|
546
562
|
{
|
547
|
-
int *val = (int *)data;
|
563
|
+
const int *val = (int *)data;
|
548
564
|
*ent /= *val;
|
549
565
|
}
|
550
566
|
static void
|
551
567
|
km_s_div_v(VALUE *ent, void *data)
|
552
568
|
{
|
553
|
-
VALUE val = (VALUE)data;
|
569
|
+
const VALUE val = (VALUE)data;
|
554
570
|
*ent = rb_funcall(*ent, id_op_div, 1, val);
|
555
571
|
}
|
556
572
|
VALUE
|
@@ -563,17 +579,19 @@ kmm_mat_s_div_destl(VALUE self, VALUE vval)
|
|
563
579
|
if ( val == 0.0 ) { rb_raise(rb_eZeroDivError, "divided by 0"); }
|
564
580
|
val = 1.0/val;
|
565
581
|
if ( sy->stype == ST_FULL ) {
|
566
|
-
int len=
|
582
|
+
const int len=LENGTHi(sy), ione=1;
|
567
583
|
dscal_(&len, &val, sy->dbody, &ione);
|
568
584
|
} else if ( sy->stype == ST_SSUB ) {
|
569
|
-
int ione=1;
|
585
|
+
const int ione=1;
|
570
586
|
if ( sy->trans ) {
|
571
|
-
|
572
|
-
|
587
|
+
const int n=s2i(sy->n);
|
588
|
+
for ( size_t i=0; i<(sy->m); i++ ) {
|
589
|
+
dscal_(&n, &val, (sy->dbody)+(i*(sy->ld)), &ione);
|
573
590
|
}
|
574
591
|
} else {
|
575
|
-
|
576
|
-
|
592
|
+
const int m=s2i(sy->m);
|
593
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
594
|
+
dscal_(&m, &val, (sy->dbody)+(i*(sy->ld)), &ione);
|
577
595
|
}
|
578
596
|
}
|
579
597
|
} else {
|
@@ -584,24 +602,26 @@ kmm_mat_s_div_destl(VALUE self, VALUE vval)
|
|
584
602
|
if ( val == cpack(0.0, 0.0) ) { rb_raise(rb_eZeroDivError, "divided by 0"); }
|
585
603
|
val = cpack(1.0, 0.0)/val;
|
586
604
|
if ( sy->stype == ST_FULL ) {
|
587
|
-
int len=
|
605
|
+
const int len=LENGTHi(sy), ione=1;
|
588
606
|
zscal_(&len, &val, sy->zbody, &ione);
|
589
607
|
} else if ( sy->stype == ST_SSUB ) {
|
590
|
-
int ione=1;
|
608
|
+
const int ione=1;
|
591
609
|
if ( sy->trans ) {
|
592
|
-
|
593
|
-
|
610
|
+
const int n=s2i(sy->n);
|
611
|
+
for ( size_t i=0; i<(sy->m); i++ ) {
|
612
|
+
zscal_(&n, &val, (sy->zbody)+(i*(sy->ld)), &ione);
|
594
613
|
}
|
595
614
|
} else {
|
596
|
-
|
597
|
-
|
615
|
+
const int m=s2i(sy->m);
|
616
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
617
|
+
zscal_(&m, &val, (sy->zbody)+(i*(sy->ld)), &ione);
|
598
618
|
}
|
599
619
|
}
|
600
620
|
} else {
|
601
621
|
km_smat_each_z(sy, km_s_mul_z, (void *)&val);
|
602
622
|
}
|
603
623
|
} else if ( sy->vtype == VT_INT ) {
|
604
|
-
int val = NUM2INT(vval);
|
624
|
+
const int val = NUM2INT(vval);
|
605
625
|
if ( val == 0 ) { rb_raise(rb_eZeroDivError, "divided by 0"); }
|
606
626
|
km_smat_each_i(sy, km_s_div_i, (void *)&val);
|
607
627
|
} else if ( sy->vtype == VT_BOOL ) {
|
@@ -617,19 +637,19 @@ kmm_mat_s_div_destl(VALUE self, VALUE vval)
|
|
617
637
|
static void
|
618
638
|
km_add_times_d(double *y, double *x, void *data)
|
619
639
|
{
|
620
|
-
double *a = (double *)data;
|
640
|
+
const double *a = (double *)data;
|
621
641
|
*y += ( (*x) * (*a) );
|
622
642
|
}
|
623
643
|
static void
|
624
644
|
km_add_times_z(COMPLEX *y, COMPLEX *x, void *data)
|
625
645
|
{
|
626
|
-
COMPLEX *a = (COMPLEX *)data;
|
646
|
+
const COMPLEX *a = (COMPLEX *)data;
|
627
647
|
*y += ( (*x) * (*a) );
|
628
648
|
}
|
629
649
|
static void
|
630
650
|
km_add_times_i(int *y, int *x, void *data)
|
631
651
|
{
|
632
|
-
int *a = (int *)data;
|
652
|
+
const int *a = (int *)data;
|
633
653
|
*y += ( (*x) * (*a) );
|
634
654
|
}
|
635
655
|
static void
|
@@ -649,53 +669,55 @@ kmm_mat_add_times_destl(VALUE self, VALUE other, VALUE valpha)
|
|
649
669
|
}
|
650
670
|
CHECK_SAME_SIZE(sx, sy);
|
651
671
|
if ( sy->vtype == VT_DOUBLE ) {
|
652
|
-
double alpha = NUM2DBL(valpha);
|
672
|
+
const double alpha = NUM2DBL(valpha);
|
653
673
|
if ( sy->stype == ST_FULL && sx->stype == ST_FULL && sy->trans == sx->trans ) {
|
654
|
-
int len =
|
674
|
+
const int len = LENGTHi(sy), ione=1;
|
655
675
|
daxpy_(&len, &alpha, sx->dbody, &ione, sy->dbody, &ione);
|
656
676
|
} else if ( sy->stype != ST_RSUB && sx->stype != ST_RSUB ) {
|
657
|
-
int incy,
|
677
|
+
int incy, incx; size_t stepx, stepy;
|
658
678
|
if ( sy->trans ) {
|
659
|
-
incy = sy->ld; stepy = 1;
|
679
|
+
incy = s2i(sy->ld); stepy = 1;
|
660
680
|
} else {
|
661
681
|
incy = 1; stepy = sy->ld;
|
662
682
|
}
|
663
683
|
if ( sx->trans ) {
|
664
|
-
incx = sx->ld; stepx = 1;
|
684
|
+
incx = s2i(sx->ld); stepx = 1;
|
665
685
|
} else {
|
666
686
|
incx = 1; stepx = sx->ld;
|
667
687
|
}
|
668
|
-
|
669
|
-
|
688
|
+
const int m=s2i(sy->m);
|
689
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
690
|
+
daxpy_(&m, &alpha, (sx->dbody)+(i*stepx), &incx, (sy->dbody)+(i*stepy), &incy);
|
670
691
|
}
|
671
692
|
} else {
|
672
693
|
km_smat_each2_d(sy, sx, km_add_times_d, (void *)&alpha);
|
673
694
|
}
|
674
695
|
} else if ( sy->vtype == VT_COMPLEX ) {
|
675
|
-
COMPLEX alpha = km_v2c(valpha);
|
696
|
+
const COMPLEX alpha = km_v2c(valpha);
|
676
697
|
if ( sy->stype == ST_FULL && sx->stype == ST_FULL && sy->trans == sx->trans ) {
|
677
|
-
int len =
|
698
|
+
const int len = LENGTHi(sy), ione=1;
|
678
699
|
zaxpy_(&len, &alpha, sx->zbody, &ione, sy->zbody, &ione);
|
679
700
|
} else if ( sy->stype != ST_RSUB && sx->stype != ST_RSUB ) {
|
680
|
-
int incy,
|
701
|
+
int incy, incx; size_t stepx, stepy;
|
681
702
|
if ( sy->trans ) {
|
682
|
-
incy = sy->ld; stepy = 1;
|
703
|
+
incy = s2i(sy->ld); stepy = 1;
|
683
704
|
} else {
|
684
705
|
incy = 1; stepy = sy->ld;
|
685
706
|
}
|
686
707
|
if ( sx->trans ) {
|
687
|
-
incx = sx->ld; stepx = 1;
|
708
|
+
incx = s2i(sx->ld); stepx = 1;
|
688
709
|
} else {
|
689
710
|
incx = 1; stepx = sx->ld;
|
690
711
|
}
|
691
|
-
|
692
|
-
|
712
|
+
const int m=s2i(sy->m);
|
713
|
+
for ( size_t i=0; i<(sy->n); i++ ) {
|
714
|
+
zaxpy_(&m, &alpha, (sx->zbody)+(i*stepx), &incx, (sy->zbody)+(i*stepy), &incy);
|
693
715
|
}
|
694
716
|
} else {
|
695
717
|
km_smat_each2_z(sy, sx, km_add_times_z, (void *)&alpha);
|
696
718
|
}
|
697
719
|
} else if ( sy->vtype == VT_INT ) {
|
698
|
-
int alpha = NUM2INT(valpha);
|
720
|
+
const int alpha = NUM2INT(valpha);
|
699
721
|
km_smat_each2_i(sy, sx, km_add_times_i, (void *)&alpha);
|
700
722
|
} else if ( sy->vtype == VT_BOOL ) {
|
701
723
|
if ( RTEST(valpha) ) {
|
@@ -772,7 +794,7 @@ kmm_mat_maximum_destl(VALUE self, VALUE other)
|
|
772
794
|
static void
|
773
795
|
km_s_maximum_d(double *ey, void *data)
|
774
796
|
{
|
775
|
-
double *val = (double *)data;
|
797
|
+
const double *val = (double *)data;
|
776
798
|
if ( *ey < *val ) {
|
777
799
|
*ey = *val;
|
778
800
|
}
|
@@ -780,7 +802,7 @@ km_s_maximum_d(double *ey, void *data)
|
|
780
802
|
static void
|
781
803
|
km_s_maximum_i(int *ey, void *data)
|
782
804
|
{
|
783
|
-
int *val = (int *)data;
|
805
|
+
const int *val = (int *)data;
|
784
806
|
if ( *ey < *val ) {
|
785
807
|
*ey = *val;
|
786
808
|
}
|
@@ -788,7 +810,7 @@ km_s_maximum_i(int *ey, void *data)
|
|
788
810
|
static void
|
789
811
|
km_s_maximum_b(bool *ey, void *data)
|
790
812
|
{
|
791
|
-
bool *val = (bool *)data;
|
813
|
+
const bool *val = (bool *)data;
|
792
814
|
if ( *val ) {
|
793
815
|
*ey = true;
|
794
816
|
}
|
@@ -796,7 +818,7 @@ km_s_maximum_b(bool *ey, void *data)
|
|
796
818
|
static void
|
797
819
|
km_s_maximum_v(VALUE *ey, void *data)
|
798
820
|
{
|
799
|
-
VALUE val = (VALUE)data;
|
821
|
+
const VALUE val = (VALUE)data;
|
800
822
|
if ( rb_funcall(*ey, id_op_lt, 1, val) ) {
|
801
823
|
*ey = val;
|
802
824
|
}
|
@@ -888,7 +910,7 @@ kmm_mat_minimum_destl(VALUE self, VALUE other)
|
|
888
910
|
static void
|
889
911
|
km_s_minimum_d(double *ey, void *data)
|
890
912
|
{
|
891
|
-
double *val = (double *)data;
|
913
|
+
const double *val = (double *)data;
|
892
914
|
if ( *val < *ey ) {
|
893
915
|
*ey = *val;
|
894
916
|
}
|
@@ -896,7 +918,7 @@ km_s_minimum_d(double *ey, void *data)
|
|
896
918
|
static void
|
897
919
|
km_s_minimum_i(int *ey, void *data)
|
898
920
|
{
|
899
|
-
int *val = (int *)data;
|
921
|
+
const int *val = (int *)data;
|
900
922
|
if ( *val < *ey ) {
|
901
923
|
*ey = *val;
|
902
924
|
}
|
@@ -904,7 +926,7 @@ km_s_minimum_i(int *ey, void *data)
|
|
904
926
|
static void
|
905
927
|
km_s_minimum_b(bool *ey, void *data)
|
906
928
|
{
|
907
|
-
bool *val = (bool *)data;
|
929
|
+
const bool *val = (bool *)data;
|
908
930
|
if ( !*val ) {
|
909
931
|
*ey = false;
|
910
932
|
}
|
@@ -912,7 +934,7 @@ km_s_minimum_b(bool *ey, void *data)
|
|
912
934
|
static void
|
913
935
|
km_s_minimum_v(VALUE *ey, void *data)
|
914
936
|
{
|
915
|
-
VALUE val = (VALUE)data;
|
937
|
+
const VALUE val = (VALUE)data;
|
916
938
|
if ( rb_funcall(val, id_op_lt, 1, *ey) ) {
|
917
939
|
*ey = val;
|
918
940
|
}
|
@@ -1002,19 +1024,19 @@ kmm_mat_pow_destl(VALUE self, VALUE other)
|
|
1002
1024
|
static void
|
1003
1025
|
km_s_pow_d(double *b, void *data)
|
1004
1026
|
{
|
1005
|
-
double *e = (double *)data;
|
1027
|
+
const double *e = (double *)data;
|
1006
1028
|
*b = pow(*b, *e);
|
1007
1029
|
}
|
1008
1030
|
static void
|
1009
1031
|
km_s_pow_z(COMPLEX *b, void *data)
|
1010
1032
|
{
|
1011
|
-
COMPLEX *e = (COMPLEX *)data;
|
1033
|
+
const COMPLEX *e = (COMPLEX *)data;
|
1012
1034
|
*b = cpow(*b, *e);
|
1013
1035
|
}
|
1014
1036
|
static void
|
1015
1037
|
km_s_pow_i(int *b, void *data)
|
1016
1038
|
{
|
1017
|
-
int *e = (int *)data;
|
1039
|
+
const int *e = (int *)data;
|
1018
1040
|
if ( *e < 0 ) {
|
1019
1041
|
rb_raise(rb_const_get(rb_mMath, id_DomainError), "the exponent must be non-negative");
|
1020
1042
|
}
|
@@ -1030,13 +1052,13 @@ km_s_pow_i(int *b, void *data)
|
|
1030
1052
|
static void
|
1031
1053
|
km_s_pow_b(bool *b, void *data)
|
1032
1054
|
{
|
1033
|
-
bool *e = (bool *)data;
|
1055
|
+
const bool *e = (bool *)data;
|
1034
1056
|
*b = ( *b || !*e );
|
1035
1057
|
}
|
1036
1058
|
static void
|
1037
1059
|
km_s_pow_v(VALUE *b, void *data)
|
1038
1060
|
{
|
1039
|
-
VALUE e = (VALUE)data;
|
1061
|
+
const VALUE e = (VALUE)data;
|
1040
1062
|
*b = rb_funcall(*b, id_op_pow, 1, e);
|
1041
1063
|
}
|
1042
1064
|
VALUE
|
@@ -1091,13 +1113,13 @@ kmm_mat_hypot_destl(VALUE self, VALUE other)
|
|
1091
1113
|
static void
|
1092
1114
|
km_s_hypot_d(double *y, void *data)
|
1093
1115
|
{
|
1094
|
-
double *x = (double *)data;
|
1116
|
+
const double *x = (double *)data;
|
1095
1117
|
*y = hypot(*y, *x);
|
1096
1118
|
}
|
1097
1119
|
static void
|
1098
1120
|
km_s_hypot_z(COMPLEX *y, void *data)
|
1099
1121
|
{
|
1100
|
-
COMPLEX *x = (COMPLEX *)data;
|
1122
|
+
const COMPLEX *x = (COMPLEX *)data;
|
1101
1123
|
*y = csqrt((*y)*(*y)+(*x)*(*x));
|
1102
1124
|
}
|
1103
1125
|
static void
|