numo-narray-alt 0.9.11 → 0.9.13
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/Gemfile +0 -1
- data/README.md +7 -0
- data/ext/numo/narray/numo/narray.h +2 -2
- data/ext/numo/narray/numo/types/robj_macro.h +1 -1
- data/ext/numo/narray/src/mh/bincount.h +233 -0
- data/ext/numo/narray/src/mh/bit/and.h +225 -0
- data/ext/numo/narray/src/mh/bit/left_shift.h +225 -0
- data/ext/numo/narray/src/mh/bit/not.h +173 -0
- data/ext/numo/narray/src/mh/bit/or.h +225 -0
- data/ext/numo/narray/src/mh/bit/right_shift.h +225 -0
- data/ext/numo/narray/src/mh/bit/xor.h +225 -0
- data/ext/numo/narray/src/mh/coerce_cast.h +9 -0
- data/ext/numo/narray/src/mh/comp/binary_func.h +37 -0
- data/ext/numo/narray/src/mh/comp/eq.h +26 -0
- data/ext/numo/narray/src/mh/comp/ge.h +26 -0
- data/ext/numo/narray/src/mh/comp/gt.h +26 -0
- data/ext/numo/narray/src/mh/comp/le.h +26 -0
- data/ext/numo/narray/src/mh/comp/lt.h +26 -0
- data/ext/numo/narray/src/mh/comp/ne.h +26 -0
- data/ext/numo/narray/src/mh/comp/nearly_eq.h +26 -0
- data/ext/numo/narray/src/mh/divmod.h +142 -0
- data/ext/numo/narray/src/mh/eye.h +1 -1
- data/ext/numo/narray/src/mh/fill.h +94 -0
- data/ext/numo/narray/src/mh/format.h +108 -0
- data/ext/numo/narray/src/mh/format_to_a.h +89 -0
- data/ext/numo/narray/src/mh/inspect.h +33 -0
- data/ext/numo/narray/src/mh/isfinite.h +42 -0
- data/ext/numo/narray/src/mh/isinf.h +42 -0
- data/ext/numo/narray/src/mh/isnan.h +42 -0
- data/ext/numo/narray/src/mh/isneginf.h +42 -0
- data/ext/numo/narray/src/mh/isposinf.h +42 -0
- data/ext/numo/narray/src/mh/math/acos.h +2 -2
- data/ext/numo/narray/src/mh/math/acosh.h +2 -2
- data/ext/numo/narray/src/mh/math/asin.h +2 -2
- data/ext/numo/narray/src/mh/math/asinh.h +2 -2
- data/ext/numo/narray/src/mh/math/atan.h +2 -2
- data/ext/numo/narray/src/mh/math/atan2.h +3 -3
- data/ext/numo/narray/src/mh/math/atanh.h +2 -2
- data/ext/numo/narray/src/mh/math/cbrt.h +2 -2
- data/ext/numo/narray/src/mh/math/cos.h +2 -2
- data/ext/numo/narray/src/mh/math/cosh.h +2 -2
- data/ext/numo/narray/src/mh/math/erf.h +2 -2
- data/ext/numo/narray/src/mh/math/erfc.h +2 -2
- data/ext/numo/narray/src/mh/math/exp.h +2 -2
- data/ext/numo/narray/src/mh/math/exp10.h +2 -2
- data/ext/numo/narray/src/mh/math/exp2.h +2 -2
- data/ext/numo/narray/src/mh/math/expm1.h +2 -2
- data/ext/numo/narray/src/mh/math/frexp.h +3 -3
- data/ext/numo/narray/src/mh/math/hypot.h +3 -3
- data/ext/numo/narray/src/mh/math/ldexp.h +3 -3
- data/ext/numo/narray/src/mh/math/log.h +2 -2
- data/ext/numo/narray/src/mh/math/log10.h +2 -2
- data/ext/numo/narray/src/mh/math/log1p.h +2 -2
- data/ext/numo/narray/src/mh/math/log2.h +2 -2
- data/ext/numo/narray/src/mh/math/sin.h +2 -2
- data/ext/numo/narray/src/mh/math/sinc.h +2 -2
- data/ext/numo/narray/src/mh/math/sinh.h +2 -2
- data/ext/numo/narray/src/mh/math/sqrt.h +8 -8
- data/ext/numo/narray/src/mh/math/tan.h +2 -2
- data/ext/numo/narray/src/mh/math/tanh.h +2 -2
- data/ext/numo/narray/src/mh/math/unary_func.h +3 -3
- data/ext/numo/narray/src/mh/minus.h +125 -0
- data/ext/numo/narray/src/mh/op/add.h +78 -0
- data/ext/numo/narray/src/mh/op/binary_func.h +423 -0
- data/ext/numo/narray/src/mh/op/div.h +118 -0
- data/ext/numo/narray/src/mh/op/mod.h +108 -0
- data/ext/numo/narray/src/mh/op/mul.h +78 -0
- data/ext/numo/narray/src/mh/op/sub.h +78 -0
- data/ext/numo/narray/src/mh/pow.h +197 -0
- data/ext/numo/narray/src/mh/rand.h +2 -2
- data/ext/numo/narray/src/mh/rand_norm.h +125 -0
- data/ext/numo/narray/src/mh/reciprocal.h +125 -0
- data/ext/numo/narray/src/mh/round/ceil.h +11 -0
- data/ext/numo/narray/src/mh/round/floor.h +11 -0
- data/ext/numo/narray/src/mh/round/rint.h +9 -0
- data/ext/numo/narray/src/mh/round/round.h +11 -0
- data/ext/numo/narray/src/mh/round/trunc.h +11 -0
- data/ext/numo/narray/src/mh/round/unary_func.h +127 -0
- data/ext/numo/narray/src/mh/sign.h +125 -0
- data/ext/numo/narray/src/mh/square.h +125 -0
- data/ext/numo/narray/src/mh/to_a.h +78 -0
- data/ext/numo/narray/src/t_bit.c +45 -234
- data/ext/numo/narray/src/t_dcomplex.c +457 -2075
- data/ext/numo/narray/src/t_dfloat.c +154 -2560
- data/ext/numo/narray/src/t_int16.c +408 -2542
- data/ext/numo/narray/src/t_int32.c +408 -2542
- data/ext/numo/narray/src/t_int64.c +408 -2542
- data/ext/numo/narray/src/t_int8.c +409 -2138
- data/ext/numo/narray/src/t_robject.c +376 -2161
- data/ext/numo/narray/src/t_scomplex.c +435 -2053
- data/ext/numo/narray/src/t_sfloat.c +149 -2557
- data/ext/numo/narray/src/t_uint16.c +407 -2537
- data/ext/numo/narray/src/t_uint32.c +407 -2537
- data/ext/numo/narray/src/t_uint64.c +407 -2537
- data/ext/numo/narray/src/t_uint8.c +407 -2132
- metadata +47 -2
|
@@ -38,6 +38,34 @@ static ID id_to_a;
|
|
|
38
38
|
VALUE cT;
|
|
39
39
|
extern VALUE cRT;
|
|
40
40
|
|
|
41
|
+
#include "mh/coerce_cast.h"
|
|
42
|
+
#include "mh/to_a.h"
|
|
43
|
+
#include "mh/fill.h"
|
|
44
|
+
#include "mh/format.h"
|
|
45
|
+
#include "mh/format_to_a.h"
|
|
46
|
+
#include "mh/inspect.h"
|
|
47
|
+
#include "mh/op/add.h"
|
|
48
|
+
#include "mh/op/sub.h"
|
|
49
|
+
#include "mh/op/mul.h"
|
|
50
|
+
#include "mh/op/div.h"
|
|
51
|
+
#include "mh/pow.h"
|
|
52
|
+
#include "mh/minus.h"
|
|
53
|
+
#include "mh/reciprocal.h"
|
|
54
|
+
#include "mh/sign.h"
|
|
55
|
+
#include "mh/square.h"
|
|
56
|
+
#include "mh/comp/eq.h"
|
|
57
|
+
#include "mh/comp/ne.h"
|
|
58
|
+
#include "mh/comp/nearly_eq.h"
|
|
59
|
+
#include "mh/round/floor.h"
|
|
60
|
+
#include "mh/round/round.h"
|
|
61
|
+
#include "mh/round/ceil.h"
|
|
62
|
+
#include "mh/round/trunc.h"
|
|
63
|
+
#include "mh/round/rint.h"
|
|
64
|
+
#include "mh/isnan.h"
|
|
65
|
+
#include "mh/isinf.h"
|
|
66
|
+
#include "mh/isposinf.h"
|
|
67
|
+
#include "mh/isneginf.h"
|
|
68
|
+
#include "mh/isfinite.h"
|
|
41
69
|
#include "mh/sum.h"
|
|
42
70
|
#include "mh/prod.h"
|
|
43
71
|
#include "mh/mean.h"
|
|
@@ -51,6 +79,7 @@ extern VALUE cRT;
|
|
|
51
79
|
#include "mh/logseq.h"
|
|
52
80
|
#include "mh/eye.h"
|
|
53
81
|
#include "mh/rand.h"
|
|
82
|
+
#include "mh/rand_norm.h"
|
|
54
83
|
#include "mh/math/sqrt.h"
|
|
55
84
|
#include "mh/math/cbrt.h"
|
|
56
85
|
#include "mh/math/log.h"
|
|
@@ -73,6 +102,34 @@ extern VALUE cRT;
|
|
|
73
102
|
#include "mh/math/atanh.h"
|
|
74
103
|
#include "mh/math/sinc.h"
|
|
75
104
|
|
|
105
|
+
DEF_NARRAY_COERCE_CAST_METHOD_FUNC(dcomplex)
|
|
106
|
+
DEF_NARRAY_TO_A_METHOD_FUNC(dcomplex)
|
|
107
|
+
DEF_NARRAY_FILL_METHOD_FUNC(dcomplex)
|
|
108
|
+
DEF_NARRAY_FORMAT_METHOD_FUNC(dcomplex)
|
|
109
|
+
DEF_NARRAY_FORMAT_TO_A_METHOD_FUNC(dcomplex)
|
|
110
|
+
DEF_NARRAY_INSPECT_METHOD_FUNC(dcomplex)
|
|
111
|
+
DEF_NARRAY_ADD_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
112
|
+
DEF_NARRAY_SUB_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
113
|
+
DEF_NARRAY_MUL_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
114
|
+
DEF_NARRAY_FLT_DIV_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
115
|
+
DEF_NARRAY_POW_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
116
|
+
DEF_NARRAY_MINUS_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
117
|
+
DEF_NARRAY_RECIPROCAL_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
118
|
+
DEF_NARRAY_SIGN_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
119
|
+
DEF_NARRAY_SQUARE_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
120
|
+
DEF_NARRAY_EQ_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
121
|
+
DEF_NARRAY_NE_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
122
|
+
DEF_NARRAY_NEARLY_EQ_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
123
|
+
DEF_NARRAY_FLT_FLOOR_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
124
|
+
DEF_NARRAY_FLT_ROUND_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
125
|
+
DEF_NARRAY_FLT_CEIL_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
126
|
+
DEF_NARRAY_FLT_TRUNC_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
127
|
+
DEF_NARRAY_FLT_RINT_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
128
|
+
DEF_NARRAY_FLT_ISNAN_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
129
|
+
DEF_NARRAY_FLT_ISINF_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
130
|
+
DEF_NARRAY_FLT_ISPOSINF_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
131
|
+
DEF_NARRAY_FLT_ISNEGINF_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
132
|
+
DEF_NARRAY_FLT_ISFINITE_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
76
133
|
DEF_NARRAY_FLT_SUM_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
77
134
|
DEF_NARRAY_FLT_PROD_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
78
135
|
DEF_NARRAY_FLT_MEAN_METHOD_FUNC(dcomplex, numo_cDComplex, dcomplex, numo_cDComplex)
|
|
@@ -85,7 +142,8 @@ DEF_NARRAY_FLT_MULSUM_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
|
85
142
|
DEF_NARRAY_FLT_SEQ_METHOD_FUNC(dcomplex)
|
|
86
143
|
DEF_NARRAY_FLT_LOGSEQ_METHOD_FUNC(dcomplex)
|
|
87
144
|
DEF_NARRAY_EYE_METHOD_FUNC(dcomplex)
|
|
88
|
-
|
|
145
|
+
DEF_NARRAY_CMP_RAND_METHOD_FUNC(dcomplex)
|
|
146
|
+
DEF_NARRAY_CMP_RAND_NORM_METHOD_FUNC(dcomplex, double)
|
|
89
147
|
DEF_NARRAY_FLT_SQRT_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
90
148
|
DEF_NARRAY_FLT_CBRT_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
91
149
|
DEF_NARRAY_FLT_LOG_METHOD_FUNC(dcomplex, numo_cDComplex)
|
|
@@ -1391,204 +1449,6 @@ static VALUE dcomplex_aset(int argc, VALUE* argv, VALUE self) {
|
|
|
1391
1449
|
return argv[argc];
|
|
1392
1450
|
}
|
|
1393
1451
|
|
|
1394
|
-
/*
|
|
1395
|
-
return NArray with cast to the type of self.
|
|
1396
|
-
@overload coerce_cast(type)
|
|
1397
|
-
@return [nil]
|
|
1398
|
-
*/
|
|
1399
|
-
static VALUE dcomplex_coerce_cast(VALUE self, VALUE type) {
|
|
1400
|
-
return Qnil;
|
|
1401
|
-
}
|
|
1402
|
-
|
|
1403
|
-
static void iter_dcomplex_to_a(na_loop_t* const lp) {
|
|
1404
|
-
size_t i, s1;
|
|
1405
|
-
char* p1;
|
|
1406
|
-
size_t* idx1;
|
|
1407
|
-
dtype x;
|
|
1408
|
-
volatile VALUE a, y;
|
|
1409
|
-
|
|
1410
|
-
INIT_COUNTER(lp, i);
|
|
1411
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
1412
|
-
a = rb_ary_new2(i);
|
|
1413
|
-
rb_ary_push(lp->args[1].value, a);
|
|
1414
|
-
if (idx1) {
|
|
1415
|
-
for (; i--;) {
|
|
1416
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
1417
|
-
y = m_data_to_num(x);
|
|
1418
|
-
rb_ary_push(a, y);
|
|
1419
|
-
}
|
|
1420
|
-
} else {
|
|
1421
|
-
for (; i--;) {
|
|
1422
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
1423
|
-
y = m_data_to_num(x);
|
|
1424
|
-
rb_ary_push(a, y);
|
|
1425
|
-
}
|
|
1426
|
-
}
|
|
1427
|
-
}
|
|
1428
|
-
|
|
1429
|
-
/*
|
|
1430
|
-
Convert self to Array.
|
|
1431
|
-
@overload to_a
|
|
1432
|
-
@return [Array]
|
|
1433
|
-
*/
|
|
1434
|
-
static VALUE dcomplex_to_a(VALUE self) {
|
|
1435
|
-
ndfunc_arg_in_t ain[3] = { { Qnil, 0 }, { sym_loop_opt }, { sym_option } };
|
|
1436
|
-
ndfunc_arg_out_t aout[1] = { { rb_cArray, 0 } }; // dummy?
|
|
1437
|
-
ndfunc_t ndf = { iter_dcomplex_to_a, FULL_LOOP_NIP, 3, 1, ain, aout };
|
|
1438
|
-
return na_ndloop_cast_narray_to_rarray(&ndf, self, Qnil);
|
|
1439
|
-
}
|
|
1440
|
-
|
|
1441
|
-
static void iter_dcomplex_fill(na_loop_t* const lp) {
|
|
1442
|
-
size_t i;
|
|
1443
|
-
char* p1;
|
|
1444
|
-
ssize_t s1;
|
|
1445
|
-
size_t* idx1;
|
|
1446
|
-
VALUE x = lp->option;
|
|
1447
|
-
dtype y;
|
|
1448
|
-
INIT_COUNTER(lp, i);
|
|
1449
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
1450
|
-
y = m_num_to_data(x);
|
|
1451
|
-
if (idx1) {
|
|
1452
|
-
for (; i--;) {
|
|
1453
|
-
SET_DATA_INDEX(p1, idx1, dtype, y);
|
|
1454
|
-
}
|
|
1455
|
-
} else {
|
|
1456
|
-
for (; i--;) {
|
|
1457
|
-
SET_DATA_STRIDE(p1, s1, dtype, y);
|
|
1458
|
-
}
|
|
1459
|
-
}
|
|
1460
|
-
}
|
|
1461
|
-
|
|
1462
|
-
/*
|
|
1463
|
-
Fill elements with other.
|
|
1464
|
-
@overload fill other
|
|
1465
|
-
@param [Numeric] other
|
|
1466
|
-
@return [Numo::DComplex] self.
|
|
1467
|
-
*/
|
|
1468
|
-
static VALUE dcomplex_fill(VALUE self, VALUE val) {
|
|
1469
|
-
ndfunc_arg_in_t ain[2] = { { OVERWRITE, 0 }, { sym_option } };
|
|
1470
|
-
ndfunc_t ndf = { iter_dcomplex_fill, FULL_LOOP, 2, 0, ain, 0 };
|
|
1471
|
-
|
|
1472
|
-
na_ndloop(&ndf, 2, self, val);
|
|
1473
|
-
return self;
|
|
1474
|
-
}
|
|
1475
|
-
|
|
1476
|
-
static VALUE format_dcomplex(VALUE fmt, dtype* x) {
|
|
1477
|
-
// fix-me
|
|
1478
|
-
char s[48];
|
|
1479
|
-
int n;
|
|
1480
|
-
|
|
1481
|
-
if (NIL_P(fmt)) {
|
|
1482
|
-
n = m_sprintf(s, *x);
|
|
1483
|
-
return rb_str_new(s, n);
|
|
1484
|
-
}
|
|
1485
|
-
return rb_funcall(fmt, '%', 1, m_data_to_num(*x));
|
|
1486
|
-
}
|
|
1487
|
-
|
|
1488
|
-
static void iter_dcomplex_format(na_loop_t* const lp) {
|
|
1489
|
-
size_t i;
|
|
1490
|
-
char *p1, *p2;
|
|
1491
|
-
ssize_t s1, s2;
|
|
1492
|
-
size_t* idx1;
|
|
1493
|
-
dtype* x;
|
|
1494
|
-
VALUE y;
|
|
1495
|
-
VALUE fmt = lp->option;
|
|
1496
|
-
INIT_COUNTER(lp, i);
|
|
1497
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
1498
|
-
INIT_PTR(lp, 1, p2, s2);
|
|
1499
|
-
if (idx1) {
|
|
1500
|
-
for (; i--;) {
|
|
1501
|
-
x = (dtype*)(p1 + *idx1);
|
|
1502
|
-
idx1++;
|
|
1503
|
-
y = format_dcomplex(fmt, x);
|
|
1504
|
-
SET_DATA_STRIDE(p2, s2, VALUE, y);
|
|
1505
|
-
}
|
|
1506
|
-
} else {
|
|
1507
|
-
for (; i--;) {
|
|
1508
|
-
x = (dtype*)p1;
|
|
1509
|
-
p1 += s1;
|
|
1510
|
-
y = format_dcomplex(fmt, x);
|
|
1511
|
-
SET_DATA_STRIDE(p2, s2, VALUE, y);
|
|
1512
|
-
}
|
|
1513
|
-
}
|
|
1514
|
-
}
|
|
1515
|
-
|
|
1516
|
-
/*
|
|
1517
|
-
Format elements into strings.
|
|
1518
|
-
@overload format format
|
|
1519
|
-
@param [String] format
|
|
1520
|
-
@return [Numo::RObject] array of formatted strings.
|
|
1521
|
-
*/
|
|
1522
|
-
static VALUE dcomplex_format(int argc, VALUE* argv, VALUE self) {
|
|
1523
|
-
VALUE fmt = Qnil;
|
|
1524
|
-
|
|
1525
|
-
ndfunc_arg_in_t ain[2] = { { Qnil, 0 }, { sym_option } };
|
|
1526
|
-
ndfunc_arg_out_t aout[1] = { { numo_cRObject, 0 } };
|
|
1527
|
-
ndfunc_t ndf = { iter_dcomplex_format, FULL_LOOP_NIP, 2, 1, ain, aout };
|
|
1528
|
-
|
|
1529
|
-
rb_scan_args(argc, argv, "01", &fmt);
|
|
1530
|
-
return na_ndloop(&ndf, 2, self, fmt);
|
|
1531
|
-
}
|
|
1532
|
-
|
|
1533
|
-
static void iter_dcomplex_format_to_a(na_loop_t* const lp) {
|
|
1534
|
-
size_t i;
|
|
1535
|
-
char* p1;
|
|
1536
|
-
ssize_t s1;
|
|
1537
|
-
size_t* idx1;
|
|
1538
|
-
dtype* x;
|
|
1539
|
-
VALUE y;
|
|
1540
|
-
volatile VALUE a;
|
|
1541
|
-
VALUE fmt = lp->option;
|
|
1542
|
-
INIT_COUNTER(lp, i);
|
|
1543
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
1544
|
-
a = rb_ary_new2(i);
|
|
1545
|
-
rb_ary_push(lp->args[1].value, a);
|
|
1546
|
-
if (idx1) {
|
|
1547
|
-
for (; i--;) {
|
|
1548
|
-
x = (dtype*)(p1 + *idx1);
|
|
1549
|
-
idx1++;
|
|
1550
|
-
y = format_dcomplex(fmt, x);
|
|
1551
|
-
rb_ary_push(a, y);
|
|
1552
|
-
}
|
|
1553
|
-
} else {
|
|
1554
|
-
for (; i--;) {
|
|
1555
|
-
x = (dtype*)p1;
|
|
1556
|
-
p1 += s1;
|
|
1557
|
-
y = format_dcomplex(fmt, x);
|
|
1558
|
-
rb_ary_push(a, y);
|
|
1559
|
-
}
|
|
1560
|
-
}
|
|
1561
|
-
}
|
|
1562
|
-
|
|
1563
|
-
/*
|
|
1564
|
-
Format elements into strings.
|
|
1565
|
-
@overload format_to_a format
|
|
1566
|
-
@param [String] format
|
|
1567
|
-
@return [Array] array of formatted strings.
|
|
1568
|
-
*/
|
|
1569
|
-
static VALUE dcomplex_format_to_a(int argc, VALUE* argv, VALUE self) {
|
|
1570
|
-
VALUE fmt = Qnil;
|
|
1571
|
-
ndfunc_arg_in_t ain[3] = { { Qnil, 0 }, { sym_loop_opt }, { sym_option } };
|
|
1572
|
-
ndfunc_arg_out_t aout[1] = { { rb_cArray, 0 } }; // dummy?
|
|
1573
|
-
ndfunc_t ndf = { iter_dcomplex_format_to_a, FULL_LOOP_NIP, 3, 1, ain, aout };
|
|
1574
|
-
|
|
1575
|
-
rb_scan_args(argc, argv, "01", &fmt);
|
|
1576
|
-
return na_ndloop_cast_narray_to_rarray(&ndf, self, fmt);
|
|
1577
|
-
}
|
|
1578
|
-
|
|
1579
|
-
static VALUE iter_dcomplex_inspect(char* ptr, size_t pos, VALUE fmt) {
|
|
1580
|
-
return format_dcomplex(fmt, (dtype*)(ptr + pos));
|
|
1581
|
-
}
|
|
1582
|
-
|
|
1583
|
-
/*
|
|
1584
|
-
Returns a string containing a human-readable representation of NArray.
|
|
1585
|
-
@overload inspect
|
|
1586
|
-
@return [String]
|
|
1587
|
-
*/
|
|
1588
|
-
static VALUE dcomplex_inspect(VALUE ary) {
|
|
1589
|
-
return na_ndloop_inspect(ary, iter_dcomplex_inspect, Qnil);
|
|
1590
|
-
}
|
|
1591
|
-
|
|
1592
1452
|
static void iter_dcomplex_each(na_loop_t* const lp) {
|
|
1593
1453
|
size_t i, s1;
|
|
1594
1454
|
char* p1;
|
|
@@ -1915,1212 +1775,157 @@ static VALUE dcomplex_abs(VALUE self) {
|
|
|
1915
1775
|
return na_ndloop(&ndf, 1, self);
|
|
1916
1776
|
}
|
|
1917
1777
|
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
size_t
|
|
1923
|
-
|
|
1924
|
-
char *p1, *p2, *p3;
|
|
1925
|
-
ssize_t s1, s2, s3;
|
|
1778
|
+
static void iter_dcomplex_conj(na_loop_t* const lp) {
|
|
1779
|
+
size_t i, n;
|
|
1780
|
+
char *p1, *p2;
|
|
1781
|
+
ssize_t s1, s2;
|
|
1782
|
+
size_t *idx1, *idx2;
|
|
1783
|
+
dtype x;
|
|
1926
1784
|
|
|
1927
1785
|
INIT_COUNTER(lp, n);
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
INIT_PTR(lp, 2, p3, s3);
|
|
1931
|
-
|
|
1932
|
-
//
|
|
1933
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype)) &&
|
|
1934
|
-
is_aligned(p3, sizeof(dtype))) {
|
|
1786
|
+
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
1787
|
+
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
1935
1788
|
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
}
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1789
|
+
if (idx1) {
|
|
1790
|
+
if (idx2) {
|
|
1791
|
+
for (i = 0; i < n; i++) {
|
|
1792
|
+
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
1793
|
+
x = m_conj(x);
|
|
1794
|
+
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
1795
|
+
}
|
|
1796
|
+
} else {
|
|
1797
|
+
for (i = 0; i < n; i++) {
|
|
1798
|
+
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
1799
|
+
x = m_conj(x);
|
|
1800
|
+
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
1947
1801
|
}
|
|
1948
|
-
return;
|
|
1949
1802
|
}
|
|
1950
|
-
|
|
1951
|
-
if (
|
|
1952
|
-
|
|
1803
|
+
} else {
|
|
1804
|
+
if (idx2) {
|
|
1805
|
+
for (i = 0; i < n; i++) {
|
|
1806
|
+
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
1807
|
+
x = m_conj(x);
|
|
1808
|
+
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
1809
|
+
}
|
|
1810
|
+
} else {
|
|
1953
1811
|
//
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
check_intdivzero(*(dtype*)p2);
|
|
1957
|
-
if (s1 == sizeof(dtype) && s3 == sizeof(dtype)) {
|
|
1958
|
-
if (p1 == p3) { // inplace case
|
|
1959
|
-
for (; i < n; i++) {
|
|
1960
|
-
((dtype*)p1)[i] = m_add(((dtype*)p1)[i], *(dtype*)p2);
|
|
1961
|
-
}
|
|
1962
|
-
} else {
|
|
1963
|
-
for (; i < n; i++) {
|
|
1964
|
-
((dtype*)p3)[i] = m_add(((dtype*)p1)[i], *(dtype*)p2);
|
|
1965
|
-
}
|
|
1966
|
-
}
|
|
1967
|
-
} else {
|
|
1812
|
+
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
1813
|
+
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
1968
1814
|
for (i = 0; i < n; i++) {
|
|
1969
|
-
|
|
1970
|
-
p1 += s1;
|
|
1971
|
-
p3 += s3;
|
|
1815
|
+
((dtype*)p2)[i] = m_conj(((dtype*)p1)[i]);
|
|
1972
1816
|
}
|
|
1817
|
+
return;
|
|
1973
1818
|
}
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
for (i = 0; i < n; i++) {
|
|
1977
|
-
check_intdivzero(*(dtype*)p2);
|
|
1978
|
-
*(dtype*)p1 = m_add(*(dtype*)p1, *(dtype*)p2);
|
|
1979
|
-
p1 += s1;
|
|
1980
|
-
p2 += s2;
|
|
1981
|
-
}
|
|
1982
|
-
} else {
|
|
1819
|
+
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
1820
|
+
//
|
|
1983
1821
|
for (i = 0; i < n; i++) {
|
|
1984
|
-
|
|
1985
|
-
*(dtype*)p3 = m_add(*(dtype*)p1, *(dtype*)p2);
|
|
1822
|
+
*(dtype*)p2 = m_conj(*(dtype*)p1);
|
|
1986
1823
|
p1 += s1;
|
|
1987
1824
|
p2 += s2;
|
|
1988
|
-
p3 += s3;
|
|
1989
1825
|
}
|
|
1826
|
+
return;
|
|
1827
|
+
//
|
|
1990
1828
|
}
|
|
1991
1829
|
}
|
|
1992
|
-
|
|
1993
|
-
|
|
1830
|
+
for (i = 0; i < n; i++) {
|
|
1831
|
+
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
1832
|
+
x = m_conj(x);
|
|
1833
|
+
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
1834
|
+
}
|
|
1994
1835
|
//
|
|
1995
1836
|
}
|
|
1996
1837
|
}
|
|
1997
|
-
for (i = 0; i < n; i++) {
|
|
1998
|
-
dtype x, y, z;
|
|
1999
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2000
|
-
GET_DATA_STRIDE(p2, s2, dtype, y);
|
|
2001
|
-
check_intdivzero(y);
|
|
2002
|
-
z = m_add(x, y);
|
|
2003
|
-
SET_DATA_STRIDE(p3, s3, dtype, z);
|
|
2004
|
-
}
|
|
2005
|
-
//
|
|
2006
|
-
}
|
|
2007
|
-
#undef check_intdivzero
|
|
2008
|
-
|
|
2009
|
-
static VALUE dcomplex_add_self(VALUE self, VALUE other) {
|
|
2010
|
-
ndfunc_arg_in_t ain[2] = { { cT, 0 }, { cT, 0 } };
|
|
2011
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2012
|
-
ndfunc_t ndf = { iter_dcomplex_add, STRIDE_LOOP, 2, 1, ain, aout };
|
|
2013
|
-
|
|
2014
|
-
return na_ndloop(&ndf, 2, self, other);
|
|
2015
1838
|
}
|
|
2016
1839
|
|
|
2017
1840
|
/*
|
|
2018
|
-
|
|
2019
|
-
@overload
|
|
2020
|
-
@
|
|
2021
|
-
@return [Numo::NArray] self + other
|
|
1841
|
+
Unary conj.
|
|
1842
|
+
@overload conj
|
|
1843
|
+
@return [Numo::DComplex] conj of self.
|
|
2022
1844
|
*/
|
|
2023
|
-
static VALUE
|
|
2024
|
-
|
|
2025
|
-
|
|
1845
|
+
static VALUE dcomplex_conj(VALUE self) {
|
|
1846
|
+
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
1847
|
+
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
1848
|
+
ndfunc_t ndf = { iter_dcomplex_conj, FULL_LOOP, 1, 1, ain, aout };
|
|
2026
1849
|
|
|
2027
|
-
|
|
2028
|
-
if (klass == cT) {
|
|
2029
|
-
return dcomplex_add_self(self, other);
|
|
2030
|
-
} else {
|
|
2031
|
-
v = rb_funcall(klass, id_cast, 1, self);
|
|
2032
|
-
return rb_funcall(v, '+', 1, other);
|
|
2033
|
-
}
|
|
1850
|
+
return na_ndloop(&ndf, 1, self);
|
|
2034
1851
|
}
|
|
2035
1852
|
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
size_t
|
|
2041
|
-
|
|
2042
|
-
char *p1, *p2, *p3;
|
|
2043
|
-
ssize_t s1, s2, s3;
|
|
1853
|
+
static void iter_dcomplex_im(na_loop_t* const lp) {
|
|
1854
|
+
size_t i, n;
|
|
1855
|
+
char *p1, *p2;
|
|
1856
|
+
ssize_t s1, s2;
|
|
1857
|
+
size_t *idx1, *idx2;
|
|
1858
|
+
dtype x;
|
|
2044
1859
|
|
|
2045
1860
|
INIT_COUNTER(lp, n);
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
INIT_PTR(lp, 2, p3, s3);
|
|
2049
|
-
|
|
2050
|
-
//
|
|
2051
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype)) &&
|
|
2052
|
-
is_aligned(p3, sizeof(dtype))) {
|
|
1861
|
+
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
1862
|
+
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
2053
1863
|
|
|
2054
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype) && s3 == sizeof(dtype)) {
|
|
2055
|
-
if (p1 == p3) { // inplace case
|
|
2056
|
-
for (; i < n; i++) {
|
|
2057
|
-
check_intdivzero(((dtype*)p2)[i]);
|
|
2058
|
-
((dtype*)p1)[i] = m_sub(((dtype*)p1)[i], ((dtype*)p2)[i]);
|
|
2059
|
-
}
|
|
2060
|
-
} else {
|
|
2061
|
-
for (; i < n; i++) {
|
|
2062
|
-
check_intdivzero(((dtype*)p2)[i]);
|
|
2063
|
-
((dtype*)p3)[i] = m_sub(((dtype*)p1)[i], ((dtype*)p2)[i]);
|
|
2064
|
-
}
|
|
2065
|
-
}
|
|
2066
|
-
return;
|
|
2067
|
-
}
|
|
2068
|
-
|
|
2069
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype)) &&
|
|
2070
|
-
is_aligned_step(s3, sizeof(dtype))) {
|
|
2071
|
-
//
|
|
2072
|
-
|
|
2073
|
-
if (s2 == 0) { // Broadcasting from scalar value.
|
|
2074
|
-
check_intdivzero(*(dtype*)p2);
|
|
2075
|
-
if (s1 == sizeof(dtype) && s3 == sizeof(dtype)) {
|
|
2076
|
-
if (p1 == p3) { // inplace case
|
|
2077
|
-
for (; i < n; i++) {
|
|
2078
|
-
((dtype*)p1)[i] = m_sub(((dtype*)p1)[i], *(dtype*)p2);
|
|
2079
|
-
}
|
|
2080
|
-
} else {
|
|
2081
|
-
for (; i < n; i++) {
|
|
2082
|
-
((dtype*)p3)[i] = m_sub(((dtype*)p1)[i], *(dtype*)p2);
|
|
2083
|
-
}
|
|
2084
|
-
}
|
|
2085
|
-
} else {
|
|
2086
|
-
for (i = 0; i < n; i++) {
|
|
2087
|
-
*(dtype*)p3 = m_sub(*(dtype*)p1, *(dtype*)p2);
|
|
2088
|
-
p1 += s1;
|
|
2089
|
-
p3 += s3;
|
|
2090
|
-
}
|
|
2091
|
-
}
|
|
2092
|
-
} else {
|
|
2093
|
-
if (p1 == p3) { // inplace case
|
|
2094
|
-
for (i = 0; i < n; i++) {
|
|
2095
|
-
check_intdivzero(*(dtype*)p2);
|
|
2096
|
-
*(dtype*)p1 = m_sub(*(dtype*)p1, *(dtype*)p2);
|
|
2097
|
-
p1 += s1;
|
|
2098
|
-
p2 += s2;
|
|
2099
|
-
}
|
|
2100
|
-
} else {
|
|
2101
|
-
for (i = 0; i < n; i++) {
|
|
2102
|
-
check_intdivzero(*(dtype*)p2);
|
|
2103
|
-
*(dtype*)p3 = m_sub(*(dtype*)p1, *(dtype*)p2);
|
|
2104
|
-
p1 += s1;
|
|
2105
|
-
p2 += s2;
|
|
2106
|
-
p3 += s3;
|
|
2107
|
-
}
|
|
2108
|
-
}
|
|
2109
|
-
}
|
|
2110
|
-
|
|
2111
|
-
return;
|
|
2112
|
-
//
|
|
2113
|
-
}
|
|
2114
|
-
}
|
|
2115
|
-
for (i = 0; i < n; i++) {
|
|
2116
|
-
dtype x, y, z;
|
|
2117
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2118
|
-
GET_DATA_STRIDE(p2, s2, dtype, y);
|
|
2119
|
-
check_intdivzero(y);
|
|
2120
|
-
z = m_sub(x, y);
|
|
2121
|
-
SET_DATA_STRIDE(p3, s3, dtype, z);
|
|
2122
|
-
}
|
|
2123
|
-
//
|
|
2124
|
-
}
|
|
2125
|
-
#undef check_intdivzero
|
|
2126
|
-
|
|
2127
|
-
static VALUE dcomplex_sub_self(VALUE self, VALUE other) {
|
|
2128
|
-
ndfunc_arg_in_t ain[2] = { { cT, 0 }, { cT, 0 } };
|
|
2129
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2130
|
-
ndfunc_t ndf = { iter_dcomplex_sub, STRIDE_LOOP, 2, 1, ain, aout };
|
|
2131
|
-
|
|
2132
|
-
return na_ndloop(&ndf, 2, self, other);
|
|
2133
|
-
}
|
|
2134
|
-
|
|
2135
|
-
/*
|
|
2136
|
-
Binary sub.
|
|
2137
|
-
@overload - other
|
|
2138
|
-
@param [Numo::NArray,Numeric] other
|
|
2139
|
-
@return [Numo::NArray] self - other
|
|
2140
|
-
*/
|
|
2141
|
-
static VALUE dcomplex_sub(VALUE self, VALUE other) {
|
|
2142
|
-
|
|
2143
|
-
VALUE klass, v;
|
|
2144
|
-
|
|
2145
|
-
klass = na_upcast(rb_obj_class(self), rb_obj_class(other));
|
|
2146
|
-
if (klass == cT) {
|
|
2147
|
-
return dcomplex_sub_self(self, other);
|
|
2148
|
-
} else {
|
|
2149
|
-
v = rb_funcall(klass, id_cast, 1, self);
|
|
2150
|
-
return rb_funcall(v, '-', 1, other);
|
|
2151
|
-
}
|
|
2152
|
-
}
|
|
2153
|
-
|
|
2154
|
-
#define check_intdivzero(y) \
|
|
2155
|
-
{}
|
|
2156
|
-
|
|
2157
|
-
static void iter_dcomplex_mul(na_loop_t* const lp) {
|
|
2158
|
-
size_t i = 0;
|
|
2159
|
-
size_t n;
|
|
2160
|
-
char *p1, *p2, *p3;
|
|
2161
|
-
ssize_t s1, s2, s3;
|
|
2162
|
-
|
|
2163
|
-
INIT_COUNTER(lp, n);
|
|
2164
|
-
INIT_PTR(lp, 0, p1, s1);
|
|
2165
|
-
INIT_PTR(lp, 1, p2, s2);
|
|
2166
|
-
INIT_PTR(lp, 2, p3, s3);
|
|
2167
|
-
|
|
2168
|
-
//
|
|
2169
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype)) &&
|
|
2170
|
-
is_aligned(p3, sizeof(dtype))) {
|
|
2171
|
-
|
|
2172
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype) && s3 == sizeof(dtype)) {
|
|
2173
|
-
if (p1 == p3) { // inplace case
|
|
2174
|
-
for (; i < n; i++) {
|
|
2175
|
-
check_intdivzero(((dtype*)p2)[i]);
|
|
2176
|
-
((dtype*)p1)[i] = m_mul(((dtype*)p1)[i], ((dtype*)p2)[i]);
|
|
2177
|
-
}
|
|
2178
|
-
} else {
|
|
2179
|
-
for (; i < n; i++) {
|
|
2180
|
-
check_intdivzero(((dtype*)p2)[i]);
|
|
2181
|
-
((dtype*)p3)[i] = m_mul(((dtype*)p1)[i], ((dtype*)p2)[i]);
|
|
2182
|
-
}
|
|
2183
|
-
}
|
|
2184
|
-
return;
|
|
2185
|
-
}
|
|
2186
|
-
|
|
2187
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype)) &&
|
|
2188
|
-
is_aligned_step(s3, sizeof(dtype))) {
|
|
2189
|
-
//
|
|
2190
|
-
|
|
2191
|
-
if (s2 == 0) { // Broadcasting from scalar value.
|
|
2192
|
-
check_intdivzero(*(dtype*)p2);
|
|
2193
|
-
if (s1 == sizeof(dtype) && s3 == sizeof(dtype)) {
|
|
2194
|
-
if (p1 == p3) { // inplace case
|
|
2195
|
-
for (; i < n; i++) {
|
|
2196
|
-
((dtype*)p1)[i] = m_mul(((dtype*)p1)[i], *(dtype*)p2);
|
|
2197
|
-
}
|
|
2198
|
-
} else {
|
|
2199
|
-
for (; i < n; i++) {
|
|
2200
|
-
((dtype*)p3)[i] = m_mul(((dtype*)p1)[i], *(dtype*)p2);
|
|
2201
|
-
}
|
|
2202
|
-
}
|
|
2203
|
-
} else {
|
|
2204
|
-
for (i = 0; i < n; i++) {
|
|
2205
|
-
*(dtype*)p3 = m_mul(*(dtype*)p1, *(dtype*)p2);
|
|
2206
|
-
p1 += s1;
|
|
2207
|
-
p3 += s3;
|
|
2208
|
-
}
|
|
2209
|
-
}
|
|
2210
|
-
} else {
|
|
2211
|
-
if (p1 == p3) { // inplace case
|
|
2212
|
-
for (i = 0; i < n; i++) {
|
|
2213
|
-
check_intdivzero(*(dtype*)p2);
|
|
2214
|
-
*(dtype*)p1 = m_mul(*(dtype*)p1, *(dtype*)p2);
|
|
2215
|
-
p1 += s1;
|
|
2216
|
-
p2 += s2;
|
|
2217
|
-
}
|
|
2218
|
-
} else {
|
|
2219
|
-
for (i = 0; i < n; i++) {
|
|
2220
|
-
check_intdivzero(*(dtype*)p2);
|
|
2221
|
-
*(dtype*)p3 = m_mul(*(dtype*)p1, *(dtype*)p2);
|
|
2222
|
-
p1 += s1;
|
|
2223
|
-
p2 += s2;
|
|
2224
|
-
p3 += s3;
|
|
2225
|
-
}
|
|
2226
|
-
}
|
|
2227
|
-
}
|
|
2228
|
-
|
|
2229
|
-
return;
|
|
2230
|
-
//
|
|
2231
|
-
}
|
|
2232
|
-
}
|
|
2233
|
-
for (i = 0; i < n; i++) {
|
|
2234
|
-
dtype x, y, z;
|
|
2235
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2236
|
-
GET_DATA_STRIDE(p2, s2, dtype, y);
|
|
2237
|
-
check_intdivzero(y);
|
|
2238
|
-
z = m_mul(x, y);
|
|
2239
|
-
SET_DATA_STRIDE(p3, s3, dtype, z);
|
|
2240
|
-
}
|
|
2241
|
-
//
|
|
2242
|
-
}
|
|
2243
|
-
#undef check_intdivzero
|
|
2244
|
-
|
|
2245
|
-
static VALUE dcomplex_mul_self(VALUE self, VALUE other) {
|
|
2246
|
-
ndfunc_arg_in_t ain[2] = { { cT, 0 }, { cT, 0 } };
|
|
2247
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2248
|
-
ndfunc_t ndf = { iter_dcomplex_mul, STRIDE_LOOP, 2, 1, ain, aout };
|
|
2249
|
-
|
|
2250
|
-
return na_ndloop(&ndf, 2, self, other);
|
|
2251
|
-
}
|
|
2252
|
-
|
|
2253
|
-
/*
|
|
2254
|
-
Binary mul.
|
|
2255
|
-
@overload * other
|
|
2256
|
-
@param [Numo::NArray,Numeric] other
|
|
2257
|
-
@return [Numo::NArray] self * other
|
|
2258
|
-
*/
|
|
2259
|
-
static VALUE dcomplex_mul(VALUE self, VALUE other) {
|
|
2260
|
-
|
|
2261
|
-
VALUE klass, v;
|
|
2262
|
-
|
|
2263
|
-
klass = na_upcast(rb_obj_class(self), rb_obj_class(other));
|
|
2264
|
-
if (klass == cT) {
|
|
2265
|
-
return dcomplex_mul_self(self, other);
|
|
2266
|
-
} else {
|
|
2267
|
-
v = rb_funcall(klass, id_cast, 1, self);
|
|
2268
|
-
return rb_funcall(v, '*', 1, other);
|
|
2269
|
-
}
|
|
2270
|
-
}
|
|
2271
|
-
|
|
2272
|
-
#define check_intdivzero(y) \
|
|
2273
|
-
{}
|
|
2274
|
-
|
|
2275
|
-
static void iter_dcomplex_div(na_loop_t* const lp) {
|
|
2276
|
-
size_t i = 0;
|
|
2277
|
-
size_t n;
|
|
2278
|
-
char *p1, *p2, *p3;
|
|
2279
|
-
ssize_t s1, s2, s3;
|
|
2280
|
-
|
|
2281
|
-
INIT_COUNTER(lp, n);
|
|
2282
|
-
INIT_PTR(lp, 0, p1, s1);
|
|
2283
|
-
INIT_PTR(lp, 1, p2, s2);
|
|
2284
|
-
INIT_PTR(lp, 2, p3, s3);
|
|
2285
|
-
|
|
2286
|
-
//
|
|
2287
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype)) &&
|
|
2288
|
-
is_aligned(p3, sizeof(dtype))) {
|
|
2289
|
-
|
|
2290
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype) && s3 == sizeof(dtype)) {
|
|
2291
|
-
if (p1 == p3) { // inplace case
|
|
2292
|
-
for (; i < n; i++) {
|
|
2293
|
-
check_intdivzero(((dtype*)p2)[i]);
|
|
2294
|
-
((dtype*)p1)[i] = m_div(((dtype*)p1)[i], ((dtype*)p2)[i]);
|
|
2295
|
-
}
|
|
2296
|
-
} else {
|
|
2297
|
-
for (; i < n; i++) {
|
|
2298
|
-
check_intdivzero(((dtype*)p2)[i]);
|
|
2299
|
-
((dtype*)p3)[i] = m_div(((dtype*)p1)[i], ((dtype*)p2)[i]);
|
|
2300
|
-
}
|
|
2301
|
-
}
|
|
2302
|
-
return;
|
|
2303
|
-
}
|
|
2304
|
-
|
|
2305
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype)) &&
|
|
2306
|
-
is_aligned_step(s3, sizeof(dtype))) {
|
|
2307
|
-
//
|
|
2308
|
-
|
|
2309
|
-
if (s2 == 0) { // Broadcasting from scalar value.
|
|
2310
|
-
check_intdivzero(*(dtype*)p2);
|
|
2311
|
-
if (s1 == sizeof(dtype) && s3 == sizeof(dtype)) {
|
|
2312
|
-
if (p1 == p3) { // inplace case
|
|
2313
|
-
for (; i < n; i++) {
|
|
2314
|
-
((dtype*)p1)[i] = m_div(((dtype*)p1)[i], *(dtype*)p2);
|
|
2315
|
-
}
|
|
2316
|
-
} else {
|
|
2317
|
-
for (; i < n; i++) {
|
|
2318
|
-
((dtype*)p3)[i] = m_div(((dtype*)p1)[i], *(dtype*)p2);
|
|
2319
|
-
}
|
|
2320
|
-
}
|
|
2321
|
-
} else {
|
|
2322
|
-
for (i = 0; i < n; i++) {
|
|
2323
|
-
*(dtype*)p3 = m_div(*(dtype*)p1, *(dtype*)p2);
|
|
2324
|
-
p1 += s1;
|
|
2325
|
-
p3 += s3;
|
|
2326
|
-
}
|
|
2327
|
-
}
|
|
2328
|
-
} else {
|
|
2329
|
-
if (p1 == p3) { // inplace case
|
|
2330
|
-
for (i = 0; i < n; i++) {
|
|
2331
|
-
check_intdivzero(*(dtype*)p2);
|
|
2332
|
-
*(dtype*)p1 = m_div(*(dtype*)p1, *(dtype*)p2);
|
|
2333
|
-
p1 += s1;
|
|
2334
|
-
p2 += s2;
|
|
2335
|
-
}
|
|
2336
|
-
} else {
|
|
2337
|
-
for (i = 0; i < n; i++) {
|
|
2338
|
-
check_intdivzero(*(dtype*)p2);
|
|
2339
|
-
*(dtype*)p3 = m_div(*(dtype*)p1, *(dtype*)p2);
|
|
2340
|
-
p1 += s1;
|
|
2341
|
-
p2 += s2;
|
|
2342
|
-
p3 += s3;
|
|
2343
|
-
}
|
|
2344
|
-
}
|
|
2345
|
-
}
|
|
2346
|
-
|
|
2347
|
-
return;
|
|
2348
|
-
//
|
|
2349
|
-
}
|
|
2350
|
-
}
|
|
2351
|
-
for (i = 0; i < n; i++) {
|
|
2352
|
-
dtype x, y, z;
|
|
2353
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2354
|
-
GET_DATA_STRIDE(p2, s2, dtype, y);
|
|
2355
|
-
check_intdivzero(y);
|
|
2356
|
-
z = m_div(x, y);
|
|
2357
|
-
SET_DATA_STRIDE(p3, s3, dtype, z);
|
|
2358
|
-
}
|
|
2359
|
-
//
|
|
2360
|
-
}
|
|
2361
|
-
#undef check_intdivzero
|
|
2362
|
-
|
|
2363
|
-
static VALUE dcomplex_div_self(VALUE self, VALUE other) {
|
|
2364
|
-
ndfunc_arg_in_t ain[2] = { { cT, 0 }, { cT, 0 } };
|
|
2365
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2366
|
-
ndfunc_t ndf = { iter_dcomplex_div, STRIDE_LOOP, 2, 1, ain, aout };
|
|
2367
|
-
|
|
2368
|
-
return na_ndloop(&ndf, 2, self, other);
|
|
2369
|
-
}
|
|
2370
|
-
|
|
2371
|
-
/*
|
|
2372
|
-
Binary div.
|
|
2373
|
-
@overload / other
|
|
2374
|
-
@param [Numo::NArray,Numeric] other
|
|
2375
|
-
@return [Numo::NArray] self / other
|
|
2376
|
-
*/
|
|
2377
|
-
static VALUE dcomplex_div(VALUE self, VALUE other) {
|
|
2378
|
-
|
|
2379
|
-
VALUE klass, v;
|
|
2380
|
-
|
|
2381
|
-
klass = na_upcast(rb_obj_class(self), rb_obj_class(other));
|
|
2382
|
-
if (klass == cT) {
|
|
2383
|
-
return dcomplex_div_self(self, other);
|
|
2384
|
-
} else {
|
|
2385
|
-
v = rb_funcall(klass, id_cast, 1, self);
|
|
2386
|
-
return rb_funcall(v, '/', 1, other);
|
|
2387
|
-
}
|
|
2388
|
-
}
|
|
2389
|
-
|
|
2390
|
-
static void iter_dcomplex_pow(na_loop_t* const lp) {
|
|
2391
|
-
size_t i;
|
|
2392
|
-
char *p1, *p2, *p3;
|
|
2393
|
-
ssize_t s1, s2, s3;
|
|
2394
|
-
dtype x, y;
|
|
2395
|
-
INIT_COUNTER(lp, i);
|
|
2396
|
-
INIT_PTR(lp, 0, p1, s1);
|
|
2397
|
-
INIT_PTR(lp, 1, p2, s2);
|
|
2398
|
-
INIT_PTR(lp, 2, p3, s3);
|
|
2399
|
-
for (; i--;) {
|
|
2400
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2401
|
-
GET_DATA_STRIDE(p2, s2, dtype, y);
|
|
2402
|
-
x = m_pow(x, y);
|
|
2403
|
-
SET_DATA_STRIDE(p3, s3, dtype, x);
|
|
2404
|
-
}
|
|
2405
|
-
}
|
|
2406
|
-
|
|
2407
|
-
static void iter_dcomplex_pow_int32(na_loop_t* const lp) {
|
|
2408
|
-
size_t i;
|
|
2409
|
-
char *p1, *p2, *p3;
|
|
2410
|
-
ssize_t s1, s2, s3;
|
|
2411
|
-
dtype x;
|
|
2412
|
-
int32_t y;
|
|
2413
|
-
INIT_COUNTER(lp, i);
|
|
2414
|
-
INIT_PTR(lp, 0, p1, s1);
|
|
2415
|
-
INIT_PTR(lp, 1, p2, s2);
|
|
2416
|
-
INIT_PTR(lp, 2, p3, s3);
|
|
2417
|
-
for (; i--;) {
|
|
2418
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2419
|
-
GET_DATA_STRIDE(p2, s2, int32_t, y);
|
|
2420
|
-
x = m_pow_int(x, y);
|
|
2421
|
-
SET_DATA_STRIDE(p3, s3, dtype, x);
|
|
2422
|
-
}
|
|
2423
|
-
}
|
|
2424
|
-
|
|
2425
|
-
static VALUE dcomplex_pow_self(VALUE self, VALUE other) {
|
|
2426
|
-
ndfunc_arg_in_t ain[2] = { { cT, 0 }, { cT, 0 } };
|
|
2427
|
-
ndfunc_arg_in_t ain_i[2] = { { cT, 0 }, { numo_cInt32, 0 } };
|
|
2428
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2429
|
-
ndfunc_t ndf = { iter_dcomplex_pow, STRIDE_LOOP, 2, 1, ain, aout };
|
|
2430
|
-
ndfunc_t ndf_i = { iter_dcomplex_pow_int32, STRIDE_LOOP, 2, 1, ain_i, aout };
|
|
2431
|
-
|
|
2432
|
-
// fixme : use na.integer?
|
|
2433
|
-
if (FIXNUM_P(other) || rb_obj_is_kind_of(other, numo_cInt32)) {
|
|
2434
|
-
return na_ndloop(&ndf_i, 2, self, other);
|
|
2435
|
-
} else {
|
|
2436
|
-
return na_ndloop(&ndf, 2, self, other);
|
|
2437
|
-
}
|
|
2438
|
-
}
|
|
2439
|
-
|
|
2440
|
-
/*
|
|
2441
|
-
Binary power.
|
|
2442
|
-
@overload ** other
|
|
2443
|
-
@param [Numo::NArray,Numeric] other
|
|
2444
|
-
@return [Numo::NArray] self to the other-th power.
|
|
2445
|
-
*/
|
|
2446
|
-
static VALUE dcomplex_pow(VALUE self, VALUE other) {
|
|
2447
|
-
|
|
2448
|
-
VALUE klass, v;
|
|
2449
|
-
klass = na_upcast(rb_obj_class(self), rb_obj_class(other));
|
|
2450
|
-
if (klass == cT) {
|
|
2451
|
-
return dcomplex_pow_self(self, other);
|
|
2452
|
-
} else {
|
|
2453
|
-
v = rb_funcall(klass, id_cast, 1, self);
|
|
2454
|
-
return rb_funcall(v, id_pow, 1, other);
|
|
2455
|
-
}
|
|
2456
|
-
}
|
|
2457
|
-
|
|
2458
|
-
static void iter_dcomplex_minus(na_loop_t* const lp) {
|
|
2459
|
-
size_t i, n;
|
|
2460
|
-
char *p1, *p2;
|
|
2461
|
-
ssize_t s1, s2;
|
|
2462
|
-
size_t *idx1, *idx2;
|
|
2463
|
-
dtype x;
|
|
2464
|
-
|
|
2465
|
-
INIT_COUNTER(lp, n);
|
|
2466
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
2467
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
2468
|
-
|
|
2469
|
-
if (idx1) {
|
|
2470
|
-
if (idx2) {
|
|
2471
|
-
for (i = 0; i < n; i++) {
|
|
2472
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2473
|
-
x = m_minus(x);
|
|
2474
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2475
|
-
}
|
|
2476
|
-
} else {
|
|
2477
|
-
for (i = 0; i < n; i++) {
|
|
2478
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2479
|
-
x = m_minus(x);
|
|
2480
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2481
|
-
}
|
|
2482
|
-
}
|
|
2483
|
-
} else {
|
|
2484
|
-
if (idx2) {
|
|
2485
|
-
for (i = 0; i < n; i++) {
|
|
2486
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2487
|
-
x = m_minus(x);
|
|
2488
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2489
|
-
}
|
|
2490
|
-
} else {
|
|
2491
|
-
//
|
|
2492
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
2493
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
2494
|
-
for (i = 0; i < n; i++) {
|
|
2495
|
-
((dtype*)p2)[i] = m_minus(((dtype*)p1)[i]);
|
|
2496
|
-
}
|
|
2497
|
-
return;
|
|
2498
|
-
}
|
|
2499
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
2500
|
-
//
|
|
2501
|
-
for (i = 0; i < n; i++) {
|
|
2502
|
-
*(dtype*)p2 = m_minus(*(dtype*)p1);
|
|
2503
|
-
p1 += s1;
|
|
2504
|
-
p2 += s2;
|
|
2505
|
-
}
|
|
2506
|
-
return;
|
|
2507
|
-
//
|
|
2508
|
-
}
|
|
2509
|
-
}
|
|
2510
|
-
for (i = 0; i < n; i++) {
|
|
2511
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2512
|
-
x = m_minus(x);
|
|
2513
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2514
|
-
}
|
|
2515
|
-
//
|
|
2516
|
-
}
|
|
2517
|
-
}
|
|
2518
|
-
}
|
|
2519
|
-
|
|
2520
|
-
/*
|
|
2521
|
-
Unary minus.
|
|
2522
|
-
@overload -@
|
|
2523
|
-
@return [Numo::DComplex] minus of self.
|
|
2524
|
-
*/
|
|
2525
|
-
static VALUE dcomplex_minus(VALUE self) {
|
|
2526
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
2527
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2528
|
-
ndfunc_t ndf = { iter_dcomplex_minus, FULL_LOOP, 1, 1, ain, aout };
|
|
2529
|
-
|
|
2530
|
-
return na_ndloop(&ndf, 1, self);
|
|
2531
|
-
}
|
|
2532
|
-
|
|
2533
|
-
static void iter_dcomplex_reciprocal(na_loop_t* const lp) {
|
|
2534
|
-
size_t i, n;
|
|
2535
|
-
char *p1, *p2;
|
|
2536
|
-
ssize_t s1, s2;
|
|
2537
|
-
size_t *idx1, *idx2;
|
|
2538
|
-
dtype x;
|
|
2539
|
-
|
|
2540
|
-
INIT_COUNTER(lp, n);
|
|
2541
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
2542
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
2543
|
-
|
|
2544
|
-
if (idx1) {
|
|
2545
|
-
if (idx2) {
|
|
2546
|
-
for (i = 0; i < n; i++) {
|
|
2547
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2548
|
-
x = m_reciprocal(x);
|
|
2549
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2550
|
-
}
|
|
2551
|
-
} else {
|
|
2552
|
-
for (i = 0; i < n; i++) {
|
|
2553
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2554
|
-
x = m_reciprocal(x);
|
|
2555
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2556
|
-
}
|
|
2557
|
-
}
|
|
2558
|
-
} else {
|
|
2559
|
-
if (idx2) {
|
|
2560
|
-
for (i = 0; i < n; i++) {
|
|
2561
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2562
|
-
x = m_reciprocal(x);
|
|
2563
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2564
|
-
}
|
|
2565
|
-
} else {
|
|
2566
|
-
//
|
|
2567
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
2568
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
2569
|
-
for (i = 0; i < n; i++) {
|
|
2570
|
-
((dtype*)p2)[i] = m_reciprocal(((dtype*)p1)[i]);
|
|
2571
|
-
}
|
|
2572
|
-
return;
|
|
2573
|
-
}
|
|
2574
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
2575
|
-
//
|
|
2576
|
-
for (i = 0; i < n; i++) {
|
|
2577
|
-
*(dtype*)p2 = m_reciprocal(*(dtype*)p1);
|
|
2578
|
-
p1 += s1;
|
|
2579
|
-
p2 += s2;
|
|
2580
|
-
}
|
|
2581
|
-
return;
|
|
2582
|
-
//
|
|
2583
|
-
}
|
|
2584
|
-
}
|
|
2585
|
-
for (i = 0; i < n; i++) {
|
|
2586
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2587
|
-
x = m_reciprocal(x);
|
|
2588
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2589
|
-
}
|
|
2590
|
-
//
|
|
2591
|
-
}
|
|
2592
|
-
}
|
|
2593
|
-
}
|
|
2594
|
-
|
|
2595
|
-
/*
|
|
2596
|
-
Unary reciprocal.
|
|
2597
|
-
@overload reciprocal
|
|
2598
|
-
@return [Numo::DComplex] reciprocal of self.
|
|
2599
|
-
*/
|
|
2600
|
-
static VALUE dcomplex_reciprocal(VALUE self) {
|
|
2601
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
2602
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2603
|
-
ndfunc_t ndf = { iter_dcomplex_reciprocal, FULL_LOOP, 1, 1, ain, aout };
|
|
2604
|
-
|
|
2605
|
-
return na_ndloop(&ndf, 1, self);
|
|
2606
|
-
}
|
|
2607
|
-
|
|
2608
|
-
static void iter_dcomplex_sign(na_loop_t* const lp) {
|
|
2609
|
-
size_t i, n;
|
|
2610
|
-
char *p1, *p2;
|
|
2611
|
-
ssize_t s1, s2;
|
|
2612
|
-
size_t *idx1, *idx2;
|
|
2613
|
-
dtype x;
|
|
2614
|
-
|
|
2615
|
-
INIT_COUNTER(lp, n);
|
|
2616
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
2617
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
2618
|
-
|
|
2619
|
-
if (idx1) {
|
|
2620
|
-
if (idx2) {
|
|
2621
|
-
for (i = 0; i < n; i++) {
|
|
2622
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2623
|
-
x = m_sign(x);
|
|
2624
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2625
|
-
}
|
|
2626
|
-
} else {
|
|
2627
|
-
for (i = 0; i < n; i++) {
|
|
2628
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2629
|
-
x = m_sign(x);
|
|
2630
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2631
|
-
}
|
|
2632
|
-
}
|
|
2633
|
-
} else {
|
|
2634
|
-
if (idx2) {
|
|
2635
|
-
for (i = 0; i < n; i++) {
|
|
2636
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2637
|
-
x = m_sign(x);
|
|
2638
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2639
|
-
}
|
|
2640
|
-
} else {
|
|
2641
|
-
//
|
|
2642
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
2643
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
2644
|
-
for (i = 0; i < n; i++) {
|
|
2645
|
-
((dtype*)p2)[i] = m_sign(((dtype*)p1)[i]);
|
|
2646
|
-
}
|
|
2647
|
-
return;
|
|
2648
|
-
}
|
|
2649
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
2650
|
-
//
|
|
2651
|
-
for (i = 0; i < n; i++) {
|
|
2652
|
-
*(dtype*)p2 = m_sign(*(dtype*)p1);
|
|
2653
|
-
p1 += s1;
|
|
2654
|
-
p2 += s2;
|
|
2655
|
-
}
|
|
2656
|
-
return;
|
|
2657
|
-
//
|
|
2658
|
-
}
|
|
2659
|
-
}
|
|
2660
|
-
for (i = 0; i < n; i++) {
|
|
2661
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2662
|
-
x = m_sign(x);
|
|
2663
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2664
|
-
}
|
|
2665
|
-
//
|
|
2666
|
-
}
|
|
2667
|
-
}
|
|
2668
|
-
}
|
|
2669
|
-
|
|
2670
|
-
/*
|
|
2671
|
-
Unary sign.
|
|
2672
|
-
@overload sign
|
|
2673
|
-
@return [Numo::DComplex] sign of self.
|
|
2674
|
-
*/
|
|
2675
|
-
static VALUE dcomplex_sign(VALUE self) {
|
|
2676
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
2677
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2678
|
-
ndfunc_t ndf = { iter_dcomplex_sign, FULL_LOOP, 1, 1, ain, aout };
|
|
2679
|
-
|
|
2680
|
-
return na_ndloop(&ndf, 1, self);
|
|
2681
|
-
}
|
|
2682
|
-
|
|
2683
|
-
static void iter_dcomplex_square(na_loop_t* const lp) {
|
|
2684
|
-
size_t i, n;
|
|
2685
|
-
char *p1, *p2;
|
|
2686
|
-
ssize_t s1, s2;
|
|
2687
|
-
size_t *idx1, *idx2;
|
|
2688
|
-
dtype x;
|
|
2689
|
-
|
|
2690
|
-
INIT_COUNTER(lp, n);
|
|
2691
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
2692
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
2693
|
-
|
|
2694
|
-
if (idx1) {
|
|
2695
|
-
if (idx2) {
|
|
2696
|
-
for (i = 0; i < n; i++) {
|
|
2697
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2698
|
-
x = m_square(x);
|
|
2699
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2700
|
-
}
|
|
2701
|
-
} else {
|
|
2702
|
-
for (i = 0; i < n; i++) {
|
|
2703
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2704
|
-
x = m_square(x);
|
|
2705
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2706
|
-
}
|
|
2707
|
-
}
|
|
2708
|
-
} else {
|
|
2709
|
-
if (idx2) {
|
|
2710
|
-
for (i = 0; i < n; i++) {
|
|
2711
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2712
|
-
x = m_square(x);
|
|
2713
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2714
|
-
}
|
|
2715
|
-
} else {
|
|
2716
|
-
//
|
|
2717
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
2718
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
2719
|
-
for (i = 0; i < n; i++) {
|
|
2720
|
-
((dtype*)p2)[i] = m_square(((dtype*)p1)[i]);
|
|
2721
|
-
}
|
|
2722
|
-
return;
|
|
2723
|
-
}
|
|
2724
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
2725
|
-
//
|
|
2726
|
-
for (i = 0; i < n; i++) {
|
|
2727
|
-
*(dtype*)p2 = m_square(*(dtype*)p1);
|
|
2728
|
-
p1 += s1;
|
|
2729
|
-
p2 += s2;
|
|
2730
|
-
}
|
|
2731
|
-
return;
|
|
2732
|
-
//
|
|
2733
|
-
}
|
|
2734
|
-
}
|
|
2735
|
-
for (i = 0; i < n; i++) {
|
|
2736
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2737
|
-
x = m_square(x);
|
|
2738
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2739
|
-
}
|
|
2740
|
-
//
|
|
2741
|
-
}
|
|
2742
|
-
}
|
|
2743
|
-
}
|
|
2744
|
-
|
|
2745
|
-
/*
|
|
2746
|
-
Unary square.
|
|
2747
|
-
@overload square
|
|
2748
|
-
@return [Numo::DComplex] square of self.
|
|
2749
|
-
*/
|
|
2750
|
-
static VALUE dcomplex_square(VALUE self) {
|
|
2751
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
2752
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2753
|
-
ndfunc_t ndf = { iter_dcomplex_square, FULL_LOOP, 1, 1, ain, aout };
|
|
2754
|
-
|
|
2755
|
-
return na_ndloop(&ndf, 1, self);
|
|
2756
|
-
}
|
|
2757
|
-
|
|
2758
|
-
static void iter_dcomplex_conj(na_loop_t* const lp) {
|
|
2759
|
-
size_t i, n;
|
|
2760
|
-
char *p1, *p2;
|
|
2761
|
-
ssize_t s1, s2;
|
|
2762
|
-
size_t *idx1, *idx2;
|
|
2763
|
-
dtype x;
|
|
2764
|
-
|
|
2765
|
-
INIT_COUNTER(lp, n);
|
|
2766
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
2767
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
2768
|
-
|
|
2769
|
-
if (idx1) {
|
|
2770
|
-
if (idx2) {
|
|
2771
|
-
for (i = 0; i < n; i++) {
|
|
2772
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2773
|
-
x = m_conj(x);
|
|
2774
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2775
|
-
}
|
|
2776
|
-
} else {
|
|
2777
|
-
for (i = 0; i < n; i++) {
|
|
2778
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2779
|
-
x = m_conj(x);
|
|
2780
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2781
|
-
}
|
|
2782
|
-
}
|
|
2783
|
-
} else {
|
|
2784
|
-
if (idx2) {
|
|
2785
|
-
for (i = 0; i < n; i++) {
|
|
2786
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2787
|
-
x = m_conj(x);
|
|
2788
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2789
|
-
}
|
|
2790
|
-
} else {
|
|
2791
|
-
//
|
|
2792
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
2793
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
2794
|
-
for (i = 0; i < n; i++) {
|
|
2795
|
-
((dtype*)p2)[i] = m_conj(((dtype*)p1)[i]);
|
|
2796
|
-
}
|
|
2797
|
-
return;
|
|
2798
|
-
}
|
|
2799
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
2800
|
-
//
|
|
2801
|
-
for (i = 0; i < n; i++) {
|
|
2802
|
-
*(dtype*)p2 = m_conj(*(dtype*)p1);
|
|
2803
|
-
p1 += s1;
|
|
2804
|
-
p2 += s2;
|
|
2805
|
-
}
|
|
2806
|
-
return;
|
|
2807
|
-
//
|
|
2808
|
-
}
|
|
2809
|
-
}
|
|
2810
|
-
for (i = 0; i < n; i++) {
|
|
2811
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2812
|
-
x = m_conj(x);
|
|
2813
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2814
|
-
}
|
|
2815
|
-
//
|
|
2816
|
-
}
|
|
2817
|
-
}
|
|
2818
|
-
}
|
|
2819
|
-
|
|
2820
|
-
/*
|
|
2821
|
-
Unary conj.
|
|
2822
|
-
@overload conj
|
|
2823
|
-
@return [Numo::DComplex] conj of self.
|
|
2824
|
-
*/
|
|
2825
|
-
static VALUE dcomplex_conj(VALUE self) {
|
|
2826
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
2827
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2828
|
-
ndfunc_t ndf = { iter_dcomplex_conj, FULL_LOOP, 1, 1, ain, aout };
|
|
2829
|
-
|
|
2830
|
-
return na_ndloop(&ndf, 1, self);
|
|
2831
|
-
}
|
|
2832
|
-
|
|
2833
|
-
static void iter_dcomplex_im(na_loop_t* const lp) {
|
|
2834
|
-
size_t i, n;
|
|
2835
|
-
char *p1, *p2;
|
|
2836
|
-
ssize_t s1, s2;
|
|
2837
|
-
size_t *idx1, *idx2;
|
|
2838
|
-
dtype x;
|
|
2839
|
-
|
|
2840
|
-
INIT_COUNTER(lp, n);
|
|
2841
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
2842
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
2843
|
-
|
|
2844
|
-
if (idx1) {
|
|
2845
|
-
if (idx2) {
|
|
2846
|
-
for (i = 0; i < n; i++) {
|
|
2847
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2848
|
-
x = m_im(x);
|
|
2849
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2850
|
-
}
|
|
2851
|
-
} else {
|
|
2852
|
-
for (i = 0; i < n; i++) {
|
|
2853
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2854
|
-
x = m_im(x);
|
|
2855
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2856
|
-
}
|
|
2857
|
-
}
|
|
2858
|
-
} else {
|
|
2859
|
-
if (idx2) {
|
|
2860
|
-
for (i = 0; i < n; i++) {
|
|
2861
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2862
|
-
x = m_im(x);
|
|
2863
|
-
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
2864
|
-
}
|
|
2865
|
-
} else {
|
|
2866
|
-
//
|
|
2867
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
2868
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
2869
|
-
for (i = 0; i < n; i++) {
|
|
2870
|
-
((dtype*)p2)[i] = m_im(((dtype*)p1)[i]);
|
|
2871
|
-
}
|
|
2872
|
-
return;
|
|
2873
|
-
}
|
|
2874
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
2875
|
-
//
|
|
2876
|
-
for (i = 0; i < n; i++) {
|
|
2877
|
-
*(dtype*)p2 = m_im(*(dtype*)p1);
|
|
2878
|
-
p1 += s1;
|
|
2879
|
-
p2 += s2;
|
|
2880
|
-
}
|
|
2881
|
-
return;
|
|
2882
|
-
//
|
|
2883
|
-
}
|
|
2884
|
-
}
|
|
2885
|
-
for (i = 0; i < n; i++) {
|
|
2886
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2887
|
-
x = m_im(x);
|
|
2888
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2889
|
-
}
|
|
2890
|
-
//
|
|
2891
|
-
}
|
|
2892
|
-
}
|
|
2893
|
-
}
|
|
2894
|
-
|
|
2895
|
-
/*
|
|
2896
|
-
Unary im.
|
|
2897
|
-
@overload im
|
|
2898
|
-
@return [Numo::DComplex] im of self.
|
|
2899
|
-
*/
|
|
2900
|
-
static VALUE dcomplex_im(VALUE self) {
|
|
2901
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
2902
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
2903
|
-
ndfunc_t ndf = { iter_dcomplex_im, FULL_LOOP, 1, 1, ain, aout };
|
|
2904
|
-
|
|
2905
|
-
return na_ndloop(&ndf, 1, self);
|
|
2906
|
-
}
|
|
2907
|
-
|
|
2908
|
-
static void iter_dcomplex_real(na_loop_t* const lp) {
|
|
2909
|
-
size_t i;
|
|
2910
|
-
char *p1, *p2;
|
|
2911
|
-
ssize_t s1, s2;
|
|
2912
|
-
size_t *idx1, *idx2;
|
|
2913
|
-
dtype x;
|
|
2914
|
-
rtype y;
|
|
2915
|
-
INIT_COUNTER(lp, i);
|
|
2916
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
2917
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
2918
|
-
if (idx1) {
|
|
2919
|
-
if (idx2) {
|
|
2920
|
-
for (; i--;) {
|
|
2921
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2922
|
-
y = m_real(x);
|
|
2923
|
-
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
2924
|
-
}
|
|
2925
|
-
} else {
|
|
2926
|
-
for (; i--;) {
|
|
2927
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2928
|
-
y = m_real(x);
|
|
2929
|
-
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
2930
|
-
}
|
|
2931
|
-
}
|
|
2932
|
-
} else {
|
|
2933
|
-
if (idx2) {
|
|
2934
|
-
for (; i--;) {
|
|
2935
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2936
|
-
y = m_real(x);
|
|
2937
|
-
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
2938
|
-
}
|
|
2939
|
-
} else {
|
|
2940
|
-
for (; i--;) {
|
|
2941
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2942
|
-
y = m_real(x);
|
|
2943
|
-
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
2944
|
-
}
|
|
2945
|
-
}
|
|
2946
|
-
}
|
|
2947
|
-
}
|
|
2948
|
-
|
|
2949
|
-
/*
|
|
2950
|
-
real of self.
|
|
2951
|
-
@overload real
|
|
2952
|
-
@return [Numo::DFloat] real of self.
|
|
2953
|
-
*/
|
|
2954
|
-
static VALUE dcomplex_real(VALUE self) {
|
|
2955
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
2956
|
-
ndfunc_arg_out_t aout[1] = { { cRT, 0 } };
|
|
2957
|
-
ndfunc_t ndf = { iter_dcomplex_real, FULL_LOOP, 1, 1, ain, aout };
|
|
2958
|
-
|
|
2959
|
-
return na_ndloop(&ndf, 1, self);
|
|
2960
|
-
}
|
|
2961
|
-
|
|
2962
|
-
static void iter_dcomplex_imag(na_loop_t* const lp) {
|
|
2963
|
-
size_t i;
|
|
2964
|
-
char *p1, *p2;
|
|
2965
|
-
ssize_t s1, s2;
|
|
2966
|
-
size_t *idx1, *idx2;
|
|
2967
|
-
dtype x;
|
|
2968
|
-
rtype y;
|
|
2969
|
-
INIT_COUNTER(lp, i);
|
|
2970
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
2971
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
2972
|
-
if (idx1) {
|
|
2973
|
-
if (idx2) {
|
|
2974
|
-
for (; i--;) {
|
|
2975
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2976
|
-
y = m_imag(x);
|
|
2977
|
-
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
2978
|
-
}
|
|
2979
|
-
} else {
|
|
2980
|
-
for (; i--;) {
|
|
2981
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
2982
|
-
y = m_imag(x);
|
|
2983
|
-
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
2984
|
-
}
|
|
2985
|
-
}
|
|
2986
|
-
} else {
|
|
2987
|
-
if (idx2) {
|
|
2988
|
-
for (; i--;) {
|
|
2989
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2990
|
-
y = m_imag(x);
|
|
2991
|
-
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
2992
|
-
}
|
|
2993
|
-
} else {
|
|
2994
|
-
for (; i--;) {
|
|
2995
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
2996
|
-
y = m_imag(x);
|
|
2997
|
-
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
2998
|
-
}
|
|
2999
|
-
}
|
|
3000
|
-
}
|
|
3001
|
-
}
|
|
3002
|
-
|
|
3003
|
-
/*
|
|
3004
|
-
imag of self.
|
|
3005
|
-
@overload imag
|
|
3006
|
-
@return [Numo::DFloat] imag of self.
|
|
3007
|
-
*/
|
|
3008
|
-
static VALUE dcomplex_imag(VALUE self) {
|
|
3009
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3010
|
-
ndfunc_arg_out_t aout[1] = { { cRT, 0 } };
|
|
3011
|
-
ndfunc_t ndf = { iter_dcomplex_imag, FULL_LOOP, 1, 1, ain, aout };
|
|
3012
|
-
|
|
3013
|
-
return na_ndloop(&ndf, 1, self);
|
|
3014
|
-
}
|
|
3015
|
-
|
|
3016
|
-
static void iter_dcomplex_arg(na_loop_t* const lp) {
|
|
3017
|
-
size_t i;
|
|
3018
|
-
char *p1, *p2;
|
|
3019
|
-
ssize_t s1, s2;
|
|
3020
|
-
size_t *idx1, *idx2;
|
|
3021
|
-
dtype x;
|
|
3022
|
-
rtype y;
|
|
3023
|
-
INIT_COUNTER(lp, i);
|
|
3024
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3025
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
3026
1864
|
if (idx1) {
|
|
3027
1865
|
if (idx2) {
|
|
3028
|
-
for (; i
|
|
1866
|
+
for (i = 0; i < n; i++) {
|
|
3029
1867
|
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3030
|
-
|
|
3031
|
-
SET_DATA_INDEX(p2, idx2,
|
|
1868
|
+
x = m_im(x);
|
|
1869
|
+
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
3032
1870
|
}
|
|
3033
1871
|
} else {
|
|
3034
|
-
for (; i
|
|
1872
|
+
for (i = 0; i < n; i++) {
|
|
3035
1873
|
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3036
|
-
|
|
3037
|
-
SET_DATA_STRIDE(p2, s2,
|
|
1874
|
+
x = m_im(x);
|
|
1875
|
+
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
3038
1876
|
}
|
|
3039
1877
|
}
|
|
3040
1878
|
} else {
|
|
3041
1879
|
if (idx2) {
|
|
3042
|
-
for (; i
|
|
1880
|
+
for (i = 0; i < n; i++) {
|
|
3043
1881
|
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3044
|
-
|
|
3045
|
-
SET_DATA_INDEX(p2, idx2,
|
|
1882
|
+
x = m_im(x);
|
|
1883
|
+
SET_DATA_INDEX(p2, idx2, dtype, x);
|
|
3046
1884
|
}
|
|
3047
1885
|
} else {
|
|
3048
|
-
|
|
1886
|
+
//
|
|
1887
|
+
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
1888
|
+
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
1889
|
+
for (i = 0; i < n; i++) {
|
|
1890
|
+
((dtype*)p2)[i] = m_im(((dtype*)p1)[i]);
|
|
1891
|
+
}
|
|
1892
|
+
return;
|
|
1893
|
+
}
|
|
1894
|
+
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
1895
|
+
//
|
|
1896
|
+
for (i = 0; i < n; i++) {
|
|
1897
|
+
*(dtype*)p2 = m_im(*(dtype*)p1);
|
|
1898
|
+
p1 += s1;
|
|
1899
|
+
p2 += s2;
|
|
1900
|
+
}
|
|
1901
|
+
return;
|
|
1902
|
+
//
|
|
1903
|
+
}
|
|
1904
|
+
}
|
|
1905
|
+
for (i = 0; i < n; i++) {
|
|
3049
1906
|
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3050
|
-
|
|
3051
|
-
SET_DATA_STRIDE(p2, s2,
|
|
1907
|
+
x = m_im(x);
|
|
1908
|
+
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
3052
1909
|
}
|
|
1910
|
+
//
|
|
3053
1911
|
}
|
|
3054
1912
|
}
|
|
3055
1913
|
}
|
|
3056
1914
|
|
|
3057
1915
|
/*
|
|
3058
|
-
|
|
3059
|
-
@overload
|
|
3060
|
-
@return [Numo::
|
|
1916
|
+
Unary im.
|
|
1917
|
+
@overload im
|
|
1918
|
+
@return [Numo::DComplex] im of self.
|
|
3061
1919
|
*/
|
|
3062
|
-
static VALUE
|
|
1920
|
+
static VALUE dcomplex_im(VALUE self) {
|
|
3063
1921
|
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3064
|
-
ndfunc_arg_out_t aout[1] = { {
|
|
3065
|
-
ndfunc_t ndf = {
|
|
1922
|
+
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
1923
|
+
ndfunc_t ndf = { iter_dcomplex_im, FULL_LOOP, 1, 1, ain, aout };
|
|
3066
1924
|
|
|
3067
1925
|
return na_ndloop(&ndf, 1, self);
|
|
3068
1926
|
}
|
|
3069
1927
|
|
|
3070
|
-
static void
|
|
3071
|
-
size_t i;
|
|
3072
|
-
char *p1, *p2;
|
|
3073
|
-
ssize_t s1, s2;
|
|
3074
|
-
size_t *idx1, *idx2;
|
|
3075
|
-
dtype x;
|
|
3076
|
-
rtype y;
|
|
3077
|
-
INIT_COUNTER(lp, i);
|
|
3078
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3079
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
3080
|
-
if (idx1) {
|
|
3081
|
-
if (idx2) {
|
|
3082
|
-
for (; i--;) {
|
|
3083
|
-
GET_DATA(p1 + *idx1, dtype, x);
|
|
3084
|
-
GET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3085
|
-
x = m_set_imag(x, y);
|
|
3086
|
-
SET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3087
|
-
}
|
|
3088
|
-
} else {
|
|
3089
|
-
for (; i--;) {
|
|
3090
|
-
GET_DATA(p1 + *idx1, dtype, x);
|
|
3091
|
-
GET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3092
|
-
x = m_set_imag(x, y);
|
|
3093
|
-
SET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3094
|
-
}
|
|
3095
|
-
}
|
|
3096
|
-
} else {
|
|
3097
|
-
if (idx2) {
|
|
3098
|
-
for (; i--;) {
|
|
3099
|
-
GET_DATA(p1, dtype, x);
|
|
3100
|
-
GET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3101
|
-
x = m_set_imag(x, y);
|
|
3102
|
-
SET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3103
|
-
}
|
|
3104
|
-
} else {
|
|
3105
|
-
for (; i--;) {
|
|
3106
|
-
GET_DATA(p1, dtype, x);
|
|
3107
|
-
GET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3108
|
-
x = m_set_imag(x, y);
|
|
3109
|
-
SET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3110
|
-
}
|
|
3111
|
-
}
|
|
3112
|
-
}
|
|
3113
|
-
}
|
|
3114
|
-
|
|
3115
|
-
static VALUE dcomplex_set_imag(VALUE self, VALUE a1) {
|
|
3116
|
-
ndfunc_arg_in_t ain[2] = { { OVERWRITE, 0 }, { cRT, 0 } };
|
|
3117
|
-
ndfunc_t ndf = { iter_dcomplex_set_imag, FULL_LOOP, 2, 0, ain, 0 };
|
|
3118
|
-
|
|
3119
|
-
na_ndloop(&ndf, 2, self, a1);
|
|
3120
|
-
return a1;
|
|
3121
|
-
}
|
|
3122
|
-
|
|
3123
|
-
static void iter_dcomplex_set_real(na_loop_t* const lp) {
|
|
1928
|
+
static void iter_dcomplex_real(na_loop_t* const lp) {
|
|
3124
1929
|
size_t i;
|
|
3125
1930
|
char *p1, *p2;
|
|
3126
1931
|
ssize_t s1, s2;
|
|
@@ -3133,560 +1938,259 @@ static void iter_dcomplex_set_real(na_loop_t* const lp) {
|
|
|
3133
1938
|
if (idx1) {
|
|
3134
1939
|
if (idx2) {
|
|
3135
1940
|
for (; i--;) {
|
|
3136
|
-
GET_DATA(p1 + *idx1, dtype, x);
|
|
3137
|
-
GET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3138
|
-
x = m_set_real(x, y);
|
|
3139
|
-
SET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3140
|
-
}
|
|
3141
|
-
} else {
|
|
3142
|
-
for (; i--;) {
|
|
3143
|
-
GET_DATA(p1 + *idx1, dtype, x);
|
|
3144
|
-
GET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3145
|
-
x = m_set_real(x, y);
|
|
3146
|
-
SET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3147
|
-
}
|
|
3148
|
-
}
|
|
3149
|
-
} else {
|
|
3150
|
-
if (idx2) {
|
|
3151
|
-
for (; i--;) {
|
|
3152
|
-
GET_DATA(p1, dtype, x);
|
|
3153
|
-
GET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3154
|
-
x = m_set_real(x, y);
|
|
3155
|
-
SET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3156
|
-
}
|
|
3157
|
-
} else {
|
|
3158
|
-
for (; i--;) {
|
|
3159
|
-
GET_DATA(p1, dtype, x);
|
|
3160
|
-
GET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3161
|
-
x = m_set_real(x, y);
|
|
3162
|
-
SET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3163
|
-
}
|
|
3164
|
-
}
|
|
3165
|
-
}
|
|
3166
|
-
}
|
|
3167
|
-
|
|
3168
|
-
static VALUE dcomplex_set_real(VALUE self, VALUE a1) {
|
|
3169
|
-
ndfunc_arg_in_t ain[2] = { { OVERWRITE, 0 }, { cRT, 0 } };
|
|
3170
|
-
ndfunc_t ndf = { iter_dcomplex_set_real, FULL_LOOP, 2, 0, ain, 0 };
|
|
3171
|
-
|
|
3172
|
-
na_ndloop(&ndf, 2, self, a1);
|
|
3173
|
-
return a1;
|
|
3174
|
-
}
|
|
3175
|
-
|
|
3176
|
-
static void iter_dcomplex_eq(na_loop_t* const lp) {
|
|
3177
|
-
size_t i;
|
|
3178
|
-
char *p1, *p2;
|
|
3179
|
-
BIT_DIGIT* a3;
|
|
3180
|
-
size_t p3;
|
|
3181
|
-
ssize_t s1, s2, s3;
|
|
3182
|
-
dtype x, y;
|
|
3183
|
-
BIT_DIGIT b;
|
|
3184
|
-
INIT_COUNTER(lp, i);
|
|
3185
|
-
INIT_PTR(lp, 0, p1, s1);
|
|
3186
|
-
INIT_PTR(lp, 1, p2, s2);
|
|
3187
|
-
INIT_PTR_BIT(lp, 2, a3, p3, s3);
|
|
3188
|
-
for (; i--;) {
|
|
3189
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3190
|
-
GET_DATA_STRIDE(p2, s2, dtype, y);
|
|
3191
|
-
b = (m_eq(x, y)) ? 1 : 0;
|
|
3192
|
-
STORE_BIT(a3, p3, b);
|
|
3193
|
-
p3 += s3;
|
|
3194
|
-
}
|
|
3195
|
-
}
|
|
3196
|
-
|
|
3197
|
-
static VALUE dcomplex_eq_self(VALUE self, VALUE other) {
|
|
3198
|
-
ndfunc_arg_in_t ain[2] = { { cT, 0 }, { cT, 0 } };
|
|
3199
|
-
ndfunc_arg_out_t aout[1] = { { numo_cBit, 0 } };
|
|
3200
|
-
ndfunc_t ndf = { iter_dcomplex_eq, STRIDE_LOOP, 2, 1, ain, aout };
|
|
3201
|
-
|
|
3202
|
-
return na_ndloop(&ndf, 2, self, other);
|
|
3203
|
-
}
|
|
3204
|
-
|
|
3205
|
-
/*
|
|
3206
|
-
Comparison eq other.
|
|
3207
|
-
@overload eq other
|
|
3208
|
-
@param [Numo::NArray,Numeric] other
|
|
3209
|
-
@return [Numo::Bit] result of self eq other.
|
|
3210
|
-
*/
|
|
3211
|
-
static VALUE dcomplex_eq(VALUE self, VALUE other) {
|
|
3212
|
-
|
|
3213
|
-
VALUE klass, v;
|
|
3214
|
-
klass = na_upcast(rb_obj_class(self), rb_obj_class(other));
|
|
3215
|
-
if (klass == cT) {
|
|
3216
|
-
return dcomplex_eq_self(self, other);
|
|
3217
|
-
} else {
|
|
3218
|
-
v = rb_funcall(klass, id_cast, 1, self);
|
|
3219
|
-
return rb_funcall(v, id_eq, 1, other);
|
|
3220
|
-
}
|
|
3221
|
-
}
|
|
3222
|
-
|
|
3223
|
-
static void iter_dcomplex_ne(na_loop_t* const lp) {
|
|
3224
|
-
size_t i;
|
|
3225
|
-
char *p1, *p2;
|
|
3226
|
-
BIT_DIGIT* a3;
|
|
3227
|
-
size_t p3;
|
|
3228
|
-
ssize_t s1, s2, s3;
|
|
3229
|
-
dtype x, y;
|
|
3230
|
-
BIT_DIGIT b;
|
|
3231
|
-
INIT_COUNTER(lp, i);
|
|
3232
|
-
INIT_PTR(lp, 0, p1, s1);
|
|
3233
|
-
INIT_PTR(lp, 1, p2, s2);
|
|
3234
|
-
INIT_PTR_BIT(lp, 2, a3, p3, s3);
|
|
3235
|
-
for (; i--;) {
|
|
3236
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3237
|
-
GET_DATA_STRIDE(p2, s2, dtype, y);
|
|
3238
|
-
b = (m_ne(x, y)) ? 1 : 0;
|
|
3239
|
-
STORE_BIT(a3, p3, b);
|
|
3240
|
-
p3 += s3;
|
|
3241
|
-
}
|
|
3242
|
-
}
|
|
3243
|
-
|
|
3244
|
-
static VALUE dcomplex_ne_self(VALUE self, VALUE other) {
|
|
3245
|
-
ndfunc_arg_in_t ain[2] = { { cT, 0 }, { cT, 0 } };
|
|
3246
|
-
ndfunc_arg_out_t aout[1] = { { numo_cBit, 0 } };
|
|
3247
|
-
ndfunc_t ndf = { iter_dcomplex_ne, STRIDE_LOOP, 2, 1, ain, aout };
|
|
3248
|
-
|
|
3249
|
-
return na_ndloop(&ndf, 2, self, other);
|
|
3250
|
-
}
|
|
3251
|
-
|
|
3252
|
-
/*
|
|
3253
|
-
Comparison ne other.
|
|
3254
|
-
@overload ne other
|
|
3255
|
-
@param [Numo::NArray,Numeric] other
|
|
3256
|
-
@return [Numo::Bit] result of self ne other.
|
|
3257
|
-
*/
|
|
3258
|
-
static VALUE dcomplex_ne(VALUE self, VALUE other) {
|
|
3259
|
-
|
|
3260
|
-
VALUE klass, v;
|
|
3261
|
-
klass = na_upcast(rb_obj_class(self), rb_obj_class(other));
|
|
3262
|
-
if (klass == cT) {
|
|
3263
|
-
return dcomplex_ne_self(self, other);
|
|
3264
|
-
} else {
|
|
3265
|
-
v = rb_funcall(klass, id_cast, 1, self);
|
|
3266
|
-
return rb_funcall(v, id_ne, 1, other);
|
|
3267
|
-
}
|
|
3268
|
-
}
|
|
3269
|
-
|
|
3270
|
-
static void iter_dcomplex_nearly_eq(na_loop_t* const lp) {
|
|
3271
|
-
size_t i;
|
|
3272
|
-
char *p1, *p2;
|
|
3273
|
-
BIT_DIGIT* a3;
|
|
3274
|
-
size_t p3;
|
|
3275
|
-
ssize_t s1, s2, s3;
|
|
3276
|
-
dtype x, y;
|
|
3277
|
-
BIT_DIGIT b;
|
|
3278
|
-
INIT_COUNTER(lp, i);
|
|
3279
|
-
INIT_PTR(lp, 0, p1, s1);
|
|
3280
|
-
INIT_PTR(lp, 1, p2, s2);
|
|
3281
|
-
INIT_PTR_BIT(lp, 2, a3, p3, s3);
|
|
3282
|
-
for (; i--;) {
|
|
3283
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3284
|
-
GET_DATA_STRIDE(p2, s2, dtype, y);
|
|
3285
|
-
b = (m_nearly_eq(x, y)) ? 1 : 0;
|
|
3286
|
-
STORE_BIT(a3, p3, b);
|
|
3287
|
-
p3 += s3;
|
|
3288
|
-
}
|
|
3289
|
-
}
|
|
3290
|
-
|
|
3291
|
-
static VALUE dcomplex_nearly_eq_self(VALUE self, VALUE other) {
|
|
3292
|
-
ndfunc_arg_in_t ain[2] = { { cT, 0 }, { cT, 0 } };
|
|
3293
|
-
ndfunc_arg_out_t aout[1] = { { numo_cBit, 0 } };
|
|
3294
|
-
ndfunc_t ndf = { iter_dcomplex_nearly_eq, STRIDE_LOOP, 2, 1, ain, aout };
|
|
3295
|
-
|
|
3296
|
-
return na_ndloop(&ndf, 2, self, other);
|
|
3297
|
-
}
|
|
3298
|
-
|
|
3299
|
-
/*
|
|
3300
|
-
Comparison nearly_eq other.
|
|
3301
|
-
@overload nearly_eq other
|
|
3302
|
-
@param [Numo::NArray,Numeric] other
|
|
3303
|
-
@return [Numo::Bit] result of self nearly_eq other.
|
|
3304
|
-
*/
|
|
3305
|
-
static VALUE dcomplex_nearly_eq(VALUE self, VALUE other) {
|
|
3306
|
-
|
|
3307
|
-
VALUE klass, v;
|
|
3308
|
-
klass = na_upcast(rb_obj_class(self), rb_obj_class(other));
|
|
3309
|
-
if (klass == cT) {
|
|
3310
|
-
return dcomplex_nearly_eq_self(self, other);
|
|
3311
|
-
} else {
|
|
3312
|
-
v = rb_funcall(klass, id_cast, 1, self);
|
|
3313
|
-
return rb_funcall(v, id_nearly_eq, 1, other);
|
|
3314
|
-
}
|
|
3315
|
-
}
|
|
3316
|
-
|
|
3317
|
-
static void iter_dcomplex_floor(na_loop_t* const lp) {
|
|
3318
|
-
size_t i, n;
|
|
3319
|
-
char *p1, *p2;
|
|
3320
|
-
ssize_t s1, s2;
|
|
3321
|
-
size_t *idx1, *idx2;
|
|
3322
|
-
dtype x;
|
|
3323
|
-
|
|
3324
|
-
INIT_COUNTER(lp, n);
|
|
3325
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3326
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
3327
|
-
|
|
3328
|
-
if (idx1) {
|
|
3329
|
-
if (idx2) {
|
|
3330
|
-
for (i = 0; i < n; i++) {
|
|
3331
1941
|
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3332
|
-
|
|
3333
|
-
SET_DATA_INDEX(p2, idx2,
|
|
1942
|
+
y = m_real(x);
|
|
1943
|
+
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3334
1944
|
}
|
|
3335
1945
|
} else {
|
|
3336
|
-
for (
|
|
1946
|
+
for (; i--;) {
|
|
3337
1947
|
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3338
|
-
|
|
3339
|
-
SET_DATA_STRIDE(p2, s2,
|
|
1948
|
+
y = m_real(x);
|
|
1949
|
+
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3340
1950
|
}
|
|
3341
1951
|
}
|
|
3342
1952
|
} else {
|
|
3343
1953
|
if (idx2) {
|
|
3344
|
-
for (
|
|
1954
|
+
for (; i--;) {
|
|
3345
1955
|
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3346
|
-
|
|
3347
|
-
SET_DATA_INDEX(p2, idx2,
|
|
1956
|
+
y = m_real(x);
|
|
1957
|
+
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3348
1958
|
}
|
|
3349
1959
|
} else {
|
|
3350
|
-
|
|
3351
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
3352
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
3353
|
-
for (i = 0; i < n; i++) {
|
|
3354
|
-
((dtype*)p2)[i] = m_floor(((dtype*)p1)[i]);
|
|
3355
|
-
}
|
|
3356
|
-
return;
|
|
3357
|
-
}
|
|
3358
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
3359
|
-
//
|
|
3360
|
-
for (i = 0; i < n; i++) {
|
|
3361
|
-
*(dtype*)p2 = m_floor(*(dtype*)p1);
|
|
3362
|
-
p1 += s1;
|
|
3363
|
-
p2 += s2;
|
|
3364
|
-
}
|
|
3365
|
-
return;
|
|
3366
|
-
//
|
|
3367
|
-
}
|
|
3368
|
-
}
|
|
3369
|
-
for (i = 0; i < n; i++) {
|
|
1960
|
+
for (; i--;) {
|
|
3370
1961
|
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3371
|
-
|
|
3372
|
-
SET_DATA_STRIDE(p2, s2,
|
|
1962
|
+
y = m_real(x);
|
|
1963
|
+
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3373
1964
|
}
|
|
3374
|
-
//
|
|
3375
1965
|
}
|
|
3376
1966
|
}
|
|
3377
1967
|
}
|
|
3378
1968
|
|
|
3379
1969
|
/*
|
|
3380
|
-
|
|
3381
|
-
@overload
|
|
3382
|
-
@return [Numo::
|
|
1970
|
+
real of self.
|
|
1971
|
+
@overload real
|
|
1972
|
+
@return [Numo::DFloat] real of self.
|
|
3383
1973
|
*/
|
|
3384
|
-
static VALUE
|
|
1974
|
+
static VALUE dcomplex_real(VALUE self) {
|
|
3385
1975
|
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3386
|
-
ndfunc_arg_out_t aout[1] = { {
|
|
3387
|
-
ndfunc_t ndf = {
|
|
1976
|
+
ndfunc_arg_out_t aout[1] = { { cRT, 0 } };
|
|
1977
|
+
ndfunc_t ndf = { iter_dcomplex_real, FULL_LOOP, 1, 1, ain, aout };
|
|
3388
1978
|
|
|
3389
1979
|
return na_ndloop(&ndf, 1, self);
|
|
3390
1980
|
}
|
|
3391
1981
|
|
|
3392
|
-
static void
|
|
3393
|
-
size_t i
|
|
1982
|
+
static void iter_dcomplex_imag(na_loop_t* const lp) {
|
|
1983
|
+
size_t i;
|
|
3394
1984
|
char *p1, *p2;
|
|
3395
1985
|
ssize_t s1, s2;
|
|
3396
1986
|
size_t *idx1, *idx2;
|
|
3397
1987
|
dtype x;
|
|
3398
|
-
|
|
3399
|
-
INIT_COUNTER(lp,
|
|
1988
|
+
rtype y;
|
|
1989
|
+
INIT_COUNTER(lp, i);
|
|
3400
1990
|
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3401
1991
|
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
3402
|
-
|
|
3403
1992
|
if (idx1) {
|
|
3404
1993
|
if (idx2) {
|
|
3405
|
-
for (
|
|
1994
|
+
for (; i--;) {
|
|
3406
1995
|
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3407
|
-
|
|
3408
|
-
SET_DATA_INDEX(p2, idx2,
|
|
1996
|
+
y = m_imag(x);
|
|
1997
|
+
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3409
1998
|
}
|
|
3410
1999
|
} else {
|
|
3411
|
-
for (
|
|
2000
|
+
for (; i--;) {
|
|
3412
2001
|
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3413
|
-
|
|
3414
|
-
SET_DATA_STRIDE(p2, s2,
|
|
2002
|
+
y = m_imag(x);
|
|
2003
|
+
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3415
2004
|
}
|
|
3416
2005
|
}
|
|
3417
2006
|
} else {
|
|
3418
2007
|
if (idx2) {
|
|
3419
|
-
for (
|
|
2008
|
+
for (; i--;) {
|
|
3420
2009
|
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3421
|
-
|
|
3422
|
-
SET_DATA_INDEX(p2, idx2,
|
|
2010
|
+
y = m_imag(x);
|
|
2011
|
+
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3423
2012
|
}
|
|
3424
2013
|
} else {
|
|
3425
|
-
|
|
3426
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
3427
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
3428
|
-
for (i = 0; i < n; i++) {
|
|
3429
|
-
((dtype*)p2)[i] = m_round(((dtype*)p1)[i]);
|
|
3430
|
-
}
|
|
3431
|
-
return;
|
|
3432
|
-
}
|
|
3433
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
3434
|
-
//
|
|
3435
|
-
for (i = 0; i < n; i++) {
|
|
3436
|
-
*(dtype*)p2 = m_round(*(dtype*)p1);
|
|
3437
|
-
p1 += s1;
|
|
3438
|
-
p2 += s2;
|
|
3439
|
-
}
|
|
3440
|
-
return;
|
|
3441
|
-
//
|
|
3442
|
-
}
|
|
3443
|
-
}
|
|
3444
|
-
for (i = 0; i < n; i++) {
|
|
2014
|
+
for (; i--;) {
|
|
3445
2015
|
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3446
|
-
|
|
3447
|
-
SET_DATA_STRIDE(p2, s2,
|
|
2016
|
+
y = m_imag(x);
|
|
2017
|
+
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3448
2018
|
}
|
|
3449
|
-
//
|
|
3450
2019
|
}
|
|
3451
2020
|
}
|
|
3452
2021
|
}
|
|
3453
2022
|
|
|
3454
2023
|
/*
|
|
3455
|
-
|
|
3456
|
-
@overload
|
|
3457
|
-
@return [Numo::
|
|
2024
|
+
imag of self.
|
|
2025
|
+
@overload imag
|
|
2026
|
+
@return [Numo::DFloat] imag of self.
|
|
3458
2027
|
*/
|
|
3459
|
-
static VALUE
|
|
2028
|
+
static VALUE dcomplex_imag(VALUE self) {
|
|
3460
2029
|
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3461
|
-
ndfunc_arg_out_t aout[1] = { {
|
|
3462
|
-
ndfunc_t ndf = {
|
|
2030
|
+
ndfunc_arg_out_t aout[1] = { { cRT, 0 } };
|
|
2031
|
+
ndfunc_t ndf = { iter_dcomplex_imag, FULL_LOOP, 1, 1, ain, aout };
|
|
3463
2032
|
|
|
3464
2033
|
return na_ndloop(&ndf, 1, self);
|
|
3465
2034
|
}
|
|
3466
2035
|
|
|
3467
|
-
static void
|
|
3468
|
-
size_t i
|
|
2036
|
+
static void iter_dcomplex_arg(na_loop_t* const lp) {
|
|
2037
|
+
size_t i;
|
|
3469
2038
|
char *p1, *p2;
|
|
3470
2039
|
ssize_t s1, s2;
|
|
3471
2040
|
size_t *idx1, *idx2;
|
|
3472
2041
|
dtype x;
|
|
3473
|
-
|
|
3474
|
-
INIT_COUNTER(lp,
|
|
2042
|
+
rtype y;
|
|
2043
|
+
INIT_COUNTER(lp, i);
|
|
3475
2044
|
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3476
2045
|
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
3477
|
-
|
|
3478
2046
|
if (idx1) {
|
|
3479
2047
|
if (idx2) {
|
|
3480
|
-
for (
|
|
2048
|
+
for (; i--;) {
|
|
3481
2049
|
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3482
|
-
|
|
3483
|
-
SET_DATA_INDEX(p2, idx2,
|
|
2050
|
+
y = m_arg(x);
|
|
2051
|
+
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3484
2052
|
}
|
|
3485
2053
|
} else {
|
|
3486
|
-
for (
|
|
2054
|
+
for (; i--;) {
|
|
3487
2055
|
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3488
|
-
|
|
3489
|
-
SET_DATA_STRIDE(p2, s2,
|
|
2056
|
+
y = m_arg(x);
|
|
2057
|
+
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3490
2058
|
}
|
|
3491
2059
|
}
|
|
3492
2060
|
} else {
|
|
3493
2061
|
if (idx2) {
|
|
3494
|
-
for (
|
|
2062
|
+
for (; i--;) {
|
|
3495
2063
|
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3496
|
-
|
|
3497
|
-
SET_DATA_INDEX(p2, idx2,
|
|
2064
|
+
y = m_arg(x);
|
|
2065
|
+
SET_DATA_INDEX(p2, idx2, rtype, y);
|
|
3498
2066
|
}
|
|
3499
2067
|
} else {
|
|
3500
|
-
|
|
3501
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
3502
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
3503
|
-
for (i = 0; i < n; i++) {
|
|
3504
|
-
((dtype*)p2)[i] = m_ceil(((dtype*)p1)[i]);
|
|
3505
|
-
}
|
|
3506
|
-
return;
|
|
3507
|
-
}
|
|
3508
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
3509
|
-
//
|
|
3510
|
-
for (i = 0; i < n; i++) {
|
|
3511
|
-
*(dtype*)p2 = m_ceil(*(dtype*)p1);
|
|
3512
|
-
p1 += s1;
|
|
3513
|
-
p2 += s2;
|
|
3514
|
-
}
|
|
3515
|
-
return;
|
|
3516
|
-
//
|
|
3517
|
-
}
|
|
3518
|
-
}
|
|
3519
|
-
for (i = 0; i < n; i++) {
|
|
2068
|
+
for (; i--;) {
|
|
3520
2069
|
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3521
|
-
|
|
3522
|
-
SET_DATA_STRIDE(p2, s2,
|
|
2070
|
+
y = m_arg(x);
|
|
2071
|
+
SET_DATA_STRIDE(p2, s2, rtype, y);
|
|
3523
2072
|
}
|
|
3524
|
-
//
|
|
3525
2073
|
}
|
|
3526
2074
|
}
|
|
3527
2075
|
}
|
|
3528
2076
|
|
|
3529
2077
|
/*
|
|
3530
|
-
|
|
3531
|
-
@overload
|
|
3532
|
-
@return [Numo::
|
|
2078
|
+
arg of self.
|
|
2079
|
+
@overload arg
|
|
2080
|
+
@return [Numo::DFloat] arg of self.
|
|
3533
2081
|
*/
|
|
3534
|
-
static VALUE
|
|
2082
|
+
static VALUE dcomplex_arg(VALUE self) {
|
|
3535
2083
|
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3536
|
-
ndfunc_arg_out_t aout[1] = { {
|
|
3537
|
-
ndfunc_t ndf = {
|
|
2084
|
+
ndfunc_arg_out_t aout[1] = { { cRT, 0 } };
|
|
2085
|
+
ndfunc_t ndf = { iter_dcomplex_arg, FULL_LOOP, 1, 1, ain, aout };
|
|
3538
2086
|
|
|
3539
2087
|
return na_ndloop(&ndf, 1, self);
|
|
3540
2088
|
}
|
|
3541
2089
|
|
|
3542
|
-
static void
|
|
3543
|
-
size_t i
|
|
2090
|
+
static void iter_dcomplex_set_imag(na_loop_t* const lp) {
|
|
2091
|
+
size_t i;
|
|
3544
2092
|
char *p1, *p2;
|
|
3545
2093
|
ssize_t s1, s2;
|
|
3546
2094
|
size_t *idx1, *idx2;
|
|
3547
2095
|
dtype x;
|
|
3548
|
-
|
|
3549
|
-
INIT_COUNTER(lp,
|
|
2096
|
+
rtype y;
|
|
2097
|
+
INIT_COUNTER(lp, i);
|
|
3550
2098
|
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3551
2099
|
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
3552
|
-
|
|
3553
2100
|
if (idx1) {
|
|
3554
2101
|
if (idx2) {
|
|
3555
|
-
for (
|
|
3556
|
-
|
|
3557
|
-
|
|
3558
|
-
|
|
2102
|
+
for (; i--;) {
|
|
2103
|
+
GET_DATA(p1 + *idx1, dtype, x);
|
|
2104
|
+
GET_DATA_INDEX(p2, idx2, rtype, y);
|
|
2105
|
+
x = m_set_imag(x, y);
|
|
2106
|
+
SET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3559
2107
|
}
|
|
3560
2108
|
} else {
|
|
3561
|
-
for (
|
|
3562
|
-
|
|
3563
|
-
|
|
3564
|
-
|
|
2109
|
+
for (; i--;) {
|
|
2110
|
+
GET_DATA(p1 + *idx1, dtype, x);
|
|
2111
|
+
GET_DATA_STRIDE(p2, s2, rtype, y);
|
|
2112
|
+
x = m_set_imag(x, y);
|
|
2113
|
+
SET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3565
2114
|
}
|
|
3566
2115
|
}
|
|
3567
2116
|
} else {
|
|
3568
2117
|
if (idx2) {
|
|
3569
|
-
for (
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
2118
|
+
for (; i--;) {
|
|
2119
|
+
GET_DATA(p1, dtype, x);
|
|
2120
|
+
GET_DATA_INDEX(p2, idx2, rtype, y);
|
|
2121
|
+
x = m_set_imag(x, y);
|
|
2122
|
+
SET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3573
2123
|
}
|
|
3574
2124
|
} else {
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
}
|
|
3581
|
-
return;
|
|
3582
|
-
}
|
|
3583
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
3584
|
-
//
|
|
3585
|
-
for (i = 0; i < n; i++) {
|
|
3586
|
-
*(dtype*)p2 = m_trunc(*(dtype*)p1);
|
|
3587
|
-
p1 += s1;
|
|
3588
|
-
p2 += s2;
|
|
3589
|
-
}
|
|
3590
|
-
return;
|
|
3591
|
-
//
|
|
3592
|
-
}
|
|
3593
|
-
}
|
|
3594
|
-
for (i = 0; i < n; i++) {
|
|
3595
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3596
|
-
x = m_trunc(x);
|
|
3597
|
-
SET_DATA_STRIDE(p2, s2, dtype, x);
|
|
2125
|
+
for (; i--;) {
|
|
2126
|
+
GET_DATA(p1, dtype, x);
|
|
2127
|
+
GET_DATA_STRIDE(p2, s2, rtype, y);
|
|
2128
|
+
x = m_set_imag(x, y);
|
|
2129
|
+
SET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3598
2130
|
}
|
|
3599
|
-
//
|
|
3600
2131
|
}
|
|
3601
2132
|
}
|
|
3602
2133
|
}
|
|
3603
2134
|
|
|
3604
|
-
|
|
3605
|
-
|
|
3606
|
-
|
|
3607
|
-
@return [Numo::DComplex] trunc of self.
|
|
3608
|
-
*/
|
|
3609
|
-
static VALUE dcomplex_trunc(VALUE self) {
|
|
3610
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3611
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
3612
|
-
ndfunc_t ndf = { iter_dcomplex_trunc, FULL_LOOP, 1, 1, ain, aout };
|
|
2135
|
+
static VALUE dcomplex_set_imag(VALUE self, VALUE a1) {
|
|
2136
|
+
ndfunc_arg_in_t ain[2] = { { OVERWRITE, 0 }, { cRT, 0 } };
|
|
2137
|
+
ndfunc_t ndf = { iter_dcomplex_set_imag, FULL_LOOP, 2, 0, ain, 0 };
|
|
3613
2138
|
|
|
3614
|
-
|
|
2139
|
+
na_ndloop(&ndf, 2, self, a1);
|
|
2140
|
+
return a1;
|
|
3615
2141
|
}
|
|
3616
2142
|
|
|
3617
|
-
static void
|
|
3618
|
-
size_t i
|
|
2143
|
+
static void iter_dcomplex_set_real(na_loop_t* const lp) {
|
|
2144
|
+
size_t i;
|
|
3619
2145
|
char *p1, *p2;
|
|
3620
2146
|
ssize_t s1, s2;
|
|
3621
2147
|
size_t *idx1, *idx2;
|
|
3622
2148
|
dtype x;
|
|
3623
|
-
|
|
3624
|
-
INIT_COUNTER(lp,
|
|
2149
|
+
rtype y;
|
|
2150
|
+
INIT_COUNTER(lp, i);
|
|
3625
2151
|
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3626
2152
|
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
|
3627
|
-
|
|
3628
2153
|
if (idx1) {
|
|
3629
2154
|
if (idx2) {
|
|
3630
|
-
for (
|
|
3631
|
-
|
|
3632
|
-
|
|
3633
|
-
|
|
2155
|
+
for (; i--;) {
|
|
2156
|
+
GET_DATA(p1 + *idx1, dtype, x);
|
|
2157
|
+
GET_DATA_INDEX(p2, idx2, rtype, y);
|
|
2158
|
+
x = m_set_real(x, y);
|
|
2159
|
+
SET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3634
2160
|
}
|
|
3635
2161
|
} else {
|
|
3636
|
-
for (
|
|
3637
|
-
|
|
3638
|
-
|
|
3639
|
-
|
|
2162
|
+
for (; i--;) {
|
|
2163
|
+
GET_DATA(p1 + *idx1, dtype, x);
|
|
2164
|
+
GET_DATA_STRIDE(p2, s2, rtype, y);
|
|
2165
|
+
x = m_set_real(x, y);
|
|
2166
|
+
SET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3640
2167
|
}
|
|
3641
2168
|
}
|
|
3642
2169
|
} else {
|
|
3643
2170
|
if (idx2) {
|
|
3644
|
-
for (
|
|
3645
|
-
|
|
3646
|
-
|
|
3647
|
-
|
|
3648
|
-
|
|
3649
|
-
} else {
|
|
3650
|
-
//
|
|
3651
|
-
if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
|
|
3652
|
-
if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
|
|
3653
|
-
for (i = 0; i < n; i++) {
|
|
3654
|
-
((dtype*)p2)[i] = m_rint(((dtype*)p1)[i]);
|
|
3655
|
-
}
|
|
3656
|
-
return;
|
|
3657
|
-
}
|
|
3658
|
-
if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
|
|
3659
|
-
//
|
|
3660
|
-
for (i = 0; i < n; i++) {
|
|
3661
|
-
*(dtype*)p2 = m_rint(*(dtype*)p1);
|
|
3662
|
-
p1 += s1;
|
|
3663
|
-
p2 += s2;
|
|
3664
|
-
}
|
|
3665
|
-
return;
|
|
3666
|
-
//
|
|
3667
|
-
}
|
|
2171
|
+
for (; i--;) {
|
|
2172
|
+
GET_DATA(p1, dtype, x);
|
|
2173
|
+
GET_DATA_INDEX(p2, idx2, rtype, y);
|
|
2174
|
+
x = m_set_real(x, y);
|
|
2175
|
+
SET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3668
2176
|
}
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
2177
|
+
} else {
|
|
2178
|
+
for (; i--;) {
|
|
2179
|
+
GET_DATA(p1, dtype, x);
|
|
2180
|
+
GET_DATA_STRIDE(p2, s2, rtype, y);
|
|
2181
|
+
x = m_set_real(x, y);
|
|
2182
|
+
SET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3673
2183
|
}
|
|
3674
|
-
//
|
|
3675
2184
|
}
|
|
3676
2185
|
}
|
|
3677
2186
|
}
|
|
3678
2187
|
|
|
3679
|
-
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
@return [Numo::DComplex] rint of self.
|
|
3683
|
-
*/
|
|
3684
|
-
static VALUE dcomplex_rint(VALUE self) {
|
|
3685
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3686
|
-
ndfunc_arg_out_t aout[1] = { { cT, 0 } };
|
|
3687
|
-
ndfunc_t ndf = { iter_dcomplex_rint, FULL_LOOP, 1, 1, ain, aout };
|
|
2188
|
+
static VALUE dcomplex_set_real(VALUE self, VALUE a1) {
|
|
2189
|
+
ndfunc_arg_in_t ain[2] = { { OVERWRITE, 0 }, { cRT, 0 } };
|
|
2190
|
+
ndfunc_t ndf = { iter_dcomplex_set_real, FULL_LOOP, 2, 0, ain, 0 };
|
|
3688
2191
|
|
|
3689
|
-
|
|
2192
|
+
na_ndloop(&ndf, 2, self, a1);
|
|
2193
|
+
return a1;
|
|
3690
2194
|
}
|
|
3691
2195
|
|
|
3692
2196
|
#define check_intdivzero(y) \
|
|
@@ -3807,216 +2311,6 @@ static VALUE dcomplex_copysign(VALUE self, VALUE other) {
|
|
|
3807
2311
|
}
|
|
3808
2312
|
}
|
|
3809
2313
|
|
|
3810
|
-
static void iter_dcomplex_isnan(na_loop_t* const lp) {
|
|
3811
|
-
size_t i;
|
|
3812
|
-
char* p1;
|
|
3813
|
-
BIT_DIGIT* a2;
|
|
3814
|
-
size_t p2;
|
|
3815
|
-
ssize_t s1, s2;
|
|
3816
|
-
size_t* idx1;
|
|
3817
|
-
dtype x;
|
|
3818
|
-
BIT_DIGIT b;
|
|
3819
|
-
INIT_COUNTER(lp, i);
|
|
3820
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3821
|
-
INIT_PTR_BIT(lp, 1, a2, p2, s2);
|
|
3822
|
-
if (idx1) {
|
|
3823
|
-
for (; i--;) {
|
|
3824
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3825
|
-
b = (m_isnan(x)) ? 1 : 0;
|
|
3826
|
-
STORE_BIT(a2, p2, b);
|
|
3827
|
-
p2 += s2;
|
|
3828
|
-
}
|
|
3829
|
-
} else {
|
|
3830
|
-
for (; i--;) {
|
|
3831
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3832
|
-
b = (m_isnan(x)) ? 1 : 0;
|
|
3833
|
-
STORE_BIT(a2, p2, b);
|
|
3834
|
-
p2 += s2;
|
|
3835
|
-
}
|
|
3836
|
-
}
|
|
3837
|
-
}
|
|
3838
|
-
|
|
3839
|
-
/*
|
|
3840
|
-
Condition of isnan.
|
|
3841
|
-
@overload isnan
|
|
3842
|
-
@return [Numo::Bit] Condition of isnan.
|
|
3843
|
-
*/
|
|
3844
|
-
static VALUE dcomplex_isnan(VALUE self) {
|
|
3845
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3846
|
-
ndfunc_arg_out_t aout[1] = { { numo_cBit, 0 } };
|
|
3847
|
-
ndfunc_t ndf = { iter_dcomplex_isnan, FULL_LOOP, 1, 1, ain, aout };
|
|
3848
|
-
|
|
3849
|
-
return na_ndloop(&ndf, 1, self);
|
|
3850
|
-
}
|
|
3851
|
-
|
|
3852
|
-
static void iter_dcomplex_isinf(na_loop_t* const lp) {
|
|
3853
|
-
size_t i;
|
|
3854
|
-
char* p1;
|
|
3855
|
-
BIT_DIGIT* a2;
|
|
3856
|
-
size_t p2;
|
|
3857
|
-
ssize_t s1, s2;
|
|
3858
|
-
size_t* idx1;
|
|
3859
|
-
dtype x;
|
|
3860
|
-
BIT_DIGIT b;
|
|
3861
|
-
INIT_COUNTER(lp, i);
|
|
3862
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3863
|
-
INIT_PTR_BIT(lp, 1, a2, p2, s2);
|
|
3864
|
-
if (idx1) {
|
|
3865
|
-
for (; i--;) {
|
|
3866
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3867
|
-
b = (m_isinf(x)) ? 1 : 0;
|
|
3868
|
-
STORE_BIT(a2, p2, b);
|
|
3869
|
-
p2 += s2;
|
|
3870
|
-
}
|
|
3871
|
-
} else {
|
|
3872
|
-
for (; i--;) {
|
|
3873
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3874
|
-
b = (m_isinf(x)) ? 1 : 0;
|
|
3875
|
-
STORE_BIT(a2, p2, b);
|
|
3876
|
-
p2 += s2;
|
|
3877
|
-
}
|
|
3878
|
-
}
|
|
3879
|
-
}
|
|
3880
|
-
|
|
3881
|
-
/*
|
|
3882
|
-
Condition of isinf.
|
|
3883
|
-
@overload isinf
|
|
3884
|
-
@return [Numo::Bit] Condition of isinf.
|
|
3885
|
-
*/
|
|
3886
|
-
static VALUE dcomplex_isinf(VALUE self) {
|
|
3887
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3888
|
-
ndfunc_arg_out_t aout[1] = { { numo_cBit, 0 } };
|
|
3889
|
-
ndfunc_t ndf = { iter_dcomplex_isinf, FULL_LOOP, 1, 1, ain, aout };
|
|
3890
|
-
|
|
3891
|
-
return na_ndloop(&ndf, 1, self);
|
|
3892
|
-
}
|
|
3893
|
-
|
|
3894
|
-
static void iter_dcomplex_isposinf(na_loop_t* const lp) {
|
|
3895
|
-
size_t i;
|
|
3896
|
-
char* p1;
|
|
3897
|
-
BIT_DIGIT* a2;
|
|
3898
|
-
size_t p2;
|
|
3899
|
-
ssize_t s1, s2;
|
|
3900
|
-
size_t* idx1;
|
|
3901
|
-
dtype x;
|
|
3902
|
-
BIT_DIGIT b;
|
|
3903
|
-
INIT_COUNTER(lp, i);
|
|
3904
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3905
|
-
INIT_PTR_BIT(lp, 1, a2, p2, s2);
|
|
3906
|
-
if (idx1) {
|
|
3907
|
-
for (; i--;) {
|
|
3908
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3909
|
-
b = (m_isposinf(x)) ? 1 : 0;
|
|
3910
|
-
STORE_BIT(a2, p2, b);
|
|
3911
|
-
p2 += s2;
|
|
3912
|
-
}
|
|
3913
|
-
} else {
|
|
3914
|
-
for (; i--;) {
|
|
3915
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3916
|
-
b = (m_isposinf(x)) ? 1 : 0;
|
|
3917
|
-
STORE_BIT(a2, p2, b);
|
|
3918
|
-
p2 += s2;
|
|
3919
|
-
}
|
|
3920
|
-
}
|
|
3921
|
-
}
|
|
3922
|
-
|
|
3923
|
-
/*
|
|
3924
|
-
Condition of isposinf.
|
|
3925
|
-
@overload isposinf
|
|
3926
|
-
@return [Numo::Bit] Condition of isposinf.
|
|
3927
|
-
*/
|
|
3928
|
-
static VALUE dcomplex_isposinf(VALUE self) {
|
|
3929
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3930
|
-
ndfunc_arg_out_t aout[1] = { { numo_cBit, 0 } };
|
|
3931
|
-
ndfunc_t ndf = { iter_dcomplex_isposinf, FULL_LOOP, 1, 1, ain, aout };
|
|
3932
|
-
|
|
3933
|
-
return na_ndloop(&ndf, 1, self);
|
|
3934
|
-
}
|
|
3935
|
-
|
|
3936
|
-
static void iter_dcomplex_isneginf(na_loop_t* const lp) {
|
|
3937
|
-
size_t i;
|
|
3938
|
-
char* p1;
|
|
3939
|
-
BIT_DIGIT* a2;
|
|
3940
|
-
size_t p2;
|
|
3941
|
-
ssize_t s1, s2;
|
|
3942
|
-
size_t* idx1;
|
|
3943
|
-
dtype x;
|
|
3944
|
-
BIT_DIGIT b;
|
|
3945
|
-
INIT_COUNTER(lp, i);
|
|
3946
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3947
|
-
INIT_PTR_BIT(lp, 1, a2, p2, s2);
|
|
3948
|
-
if (idx1) {
|
|
3949
|
-
for (; i--;) {
|
|
3950
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3951
|
-
b = (m_isneginf(x)) ? 1 : 0;
|
|
3952
|
-
STORE_BIT(a2, p2, b);
|
|
3953
|
-
p2 += s2;
|
|
3954
|
-
}
|
|
3955
|
-
} else {
|
|
3956
|
-
for (; i--;) {
|
|
3957
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
3958
|
-
b = (m_isneginf(x)) ? 1 : 0;
|
|
3959
|
-
STORE_BIT(a2, p2, b);
|
|
3960
|
-
p2 += s2;
|
|
3961
|
-
}
|
|
3962
|
-
}
|
|
3963
|
-
}
|
|
3964
|
-
|
|
3965
|
-
/*
|
|
3966
|
-
Condition of isneginf.
|
|
3967
|
-
@overload isneginf
|
|
3968
|
-
@return [Numo::Bit] Condition of isneginf.
|
|
3969
|
-
*/
|
|
3970
|
-
static VALUE dcomplex_isneginf(VALUE self) {
|
|
3971
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
3972
|
-
ndfunc_arg_out_t aout[1] = { { numo_cBit, 0 } };
|
|
3973
|
-
ndfunc_t ndf = { iter_dcomplex_isneginf, FULL_LOOP, 1, 1, ain, aout };
|
|
3974
|
-
|
|
3975
|
-
return na_ndloop(&ndf, 1, self);
|
|
3976
|
-
}
|
|
3977
|
-
|
|
3978
|
-
static void iter_dcomplex_isfinite(na_loop_t* const lp) {
|
|
3979
|
-
size_t i;
|
|
3980
|
-
char* p1;
|
|
3981
|
-
BIT_DIGIT* a2;
|
|
3982
|
-
size_t p2;
|
|
3983
|
-
ssize_t s1, s2;
|
|
3984
|
-
size_t* idx1;
|
|
3985
|
-
dtype x;
|
|
3986
|
-
BIT_DIGIT b;
|
|
3987
|
-
INIT_COUNTER(lp, i);
|
|
3988
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
3989
|
-
INIT_PTR_BIT(lp, 1, a2, p2, s2);
|
|
3990
|
-
if (idx1) {
|
|
3991
|
-
for (; i--;) {
|
|
3992
|
-
GET_DATA_INDEX(p1, idx1, dtype, x);
|
|
3993
|
-
b = (m_isfinite(x)) ? 1 : 0;
|
|
3994
|
-
STORE_BIT(a2, p2, b);
|
|
3995
|
-
p2 += s2;
|
|
3996
|
-
}
|
|
3997
|
-
} else {
|
|
3998
|
-
for (; i--;) {
|
|
3999
|
-
GET_DATA_STRIDE(p1, s1, dtype, x);
|
|
4000
|
-
b = (m_isfinite(x)) ? 1 : 0;
|
|
4001
|
-
STORE_BIT(a2, p2, b);
|
|
4002
|
-
p2 += s2;
|
|
4003
|
-
}
|
|
4004
|
-
}
|
|
4005
|
-
}
|
|
4006
|
-
|
|
4007
|
-
/*
|
|
4008
|
-
Condition of isfinite.
|
|
4009
|
-
@overload isfinite
|
|
4010
|
-
@return [Numo::Bit] Condition of isfinite.
|
|
4011
|
-
*/
|
|
4012
|
-
static VALUE dcomplex_isfinite(VALUE self) {
|
|
4013
|
-
ndfunc_arg_in_t ain[1] = { { cT, 0 } };
|
|
4014
|
-
ndfunc_arg_out_t aout[1] = { { numo_cBit, 0 } };
|
|
4015
|
-
ndfunc_t ndf = { iter_dcomplex_isfinite, FULL_LOOP, 1, 1, ain, aout };
|
|
4016
|
-
|
|
4017
|
-
return na_ndloop(&ndf, 1, self);
|
|
4018
|
-
}
|
|
4019
|
-
|
|
4020
2314
|
static void iter_dcomplex_kahan_sum(na_loop_t* const lp) {
|
|
4021
2315
|
size_t n;
|
|
4022
2316
|
char *p1, *p2;
|
|
@@ -4065,99 +2359,6 @@ static VALUE dcomplex_kahan_sum(int argc, VALUE* argv, VALUE self) {
|
|
|
4065
2359
|
return dcomplex_extract(v);
|
|
4066
2360
|
}
|
|
4067
2361
|
|
|
4068
|
-
typedef struct {
|
|
4069
|
-
dtype mu;
|
|
4070
|
-
rtype sigma;
|
|
4071
|
-
} randn_opt_t;
|
|
4072
|
-
|
|
4073
|
-
static void iter_dcomplex_rand_norm(na_loop_t* const lp) {
|
|
4074
|
-
size_t i;
|
|
4075
|
-
char* p1;
|
|
4076
|
-
ssize_t s1;
|
|
4077
|
-
size_t* idx1;
|
|
4078
|
-
|
|
4079
|
-
dtype* a0;
|
|
4080
|
-
|
|
4081
|
-
dtype mu;
|
|
4082
|
-
rtype sigma;
|
|
4083
|
-
randn_opt_t* g;
|
|
4084
|
-
|
|
4085
|
-
INIT_COUNTER(lp, i);
|
|
4086
|
-
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
|
4087
|
-
g = (randn_opt_t*)(lp->opt_ptr);
|
|
4088
|
-
mu = g->mu;
|
|
4089
|
-
sigma = g->sigma;
|
|
4090
|
-
|
|
4091
|
-
if (idx1) {
|
|
4092
|
-
|
|
4093
|
-
for (; i--;) {
|
|
4094
|
-
a0 = (dtype*)(p1 + *idx1);
|
|
4095
|
-
m_rand_norm(mu, sigma, a0);
|
|
4096
|
-
idx1 += 1;
|
|
4097
|
-
}
|
|
4098
|
-
|
|
4099
|
-
} else {
|
|
4100
|
-
|
|
4101
|
-
for (; i--;) {
|
|
4102
|
-
a0 = (dtype*)(p1);
|
|
4103
|
-
m_rand_norm(mu, sigma, a0);
|
|
4104
|
-
p1 += s1;
|
|
4105
|
-
}
|
|
4106
|
-
}
|
|
4107
|
-
}
|
|
4108
|
-
|
|
4109
|
-
/*
|
|
4110
|
-
Generates random numbers from the normal distribution on self narray
|
|
4111
|
-
using Box-Muller Transformation.
|
|
4112
|
-
@overload rand_norm([mu,[sigma]])
|
|
4113
|
-
@param [Numeric] mu mean of normal distribution. (default=0)
|
|
4114
|
-
@param [Numeric] sigma standard deviation of normal distribution. (default=1)
|
|
4115
|
-
@return [Numo::DComplex] self.
|
|
4116
|
-
@example
|
|
4117
|
-
Numo::DFloat.new(5,5).rand_norm
|
|
4118
|
-
# => Numo::DFloat#shape=[5,5]
|
|
4119
|
-
# [[-0.581255, -0.168354, 0.586895, -0.595142, -0.802802],
|
|
4120
|
-
# [-0.326106, 0.282922, 1.68427, 0.918499, -0.0485384],
|
|
4121
|
-
# [-0.464453, -0.992194, 0.413794, -0.60717, -0.699695],
|
|
4122
|
-
# [-1.64168, 0.48676, -0.875871, -1.43275, 0.812172],
|
|
4123
|
-
# [-0.209975, -0.103612, -0.878617, -1.42495, 1.0968]]
|
|
4124
|
-
|
|
4125
|
-
Numo::DFloat.new(5,5).rand_norm(10,0.1)
|
|
4126
|
-
# => Numo::DFloat#shape=[5,5]
|
|
4127
|
-
# [[9.9019, 9.90339, 10.0826, 9.98384, 9.72861],
|
|
4128
|
-
# [9.81507, 10.0272, 9.91445, 10.0568, 9.88923],
|
|
4129
|
-
# [10.0234, 9.97874, 9.96011, 9.9006, 9.99964],
|
|
4130
|
-
# [10.0186, 9.94598, 9.92236, 9.99811, 9.97003],
|
|
4131
|
-
# [9.79266, 9.95044, 9.95212, 9.93692, 10.2027]]
|
|
4132
|
-
|
|
4133
|
-
Numo::DComplex.new(3,3).rand_norm(5+5i)
|
|
4134
|
-
# => Numo::DComplex#shape=[3,3]
|
|
4135
|
-
# [[5.84303+4.40052i, 4.00984+6.08982i, 5.10979+5.13215i],
|
|
4136
|
-
# [4.26477+3.99655i, 4.90052+5.00763i, 4.46607+2.3444i],
|
|
4137
|
-
# [4.5528+7.11003i, 5.62117+6.69094i, 5.05443+5.35133i]]
|
|
4138
|
-
*/
|
|
4139
|
-
static VALUE dcomplex_rand_norm(int argc, VALUE* argv, VALUE self) {
|
|
4140
|
-
int n;
|
|
4141
|
-
randn_opt_t g;
|
|
4142
|
-
VALUE v1 = Qnil, v2 = Qnil;
|
|
4143
|
-
ndfunc_arg_in_t ain[1] = { { OVERWRITE, 0 } };
|
|
4144
|
-
ndfunc_t ndf = { iter_dcomplex_rand_norm, FULL_LOOP, 1, 0, ain, 0 };
|
|
4145
|
-
|
|
4146
|
-
n = rb_scan_args(argc, argv, "02", &v1, &v2);
|
|
4147
|
-
if (n == 0) {
|
|
4148
|
-
g.mu = m_zero;
|
|
4149
|
-
} else {
|
|
4150
|
-
g.mu = m_num_to_data(v1);
|
|
4151
|
-
}
|
|
4152
|
-
if (n == 2) {
|
|
4153
|
-
g.sigma = NUM2DBL(v2);
|
|
4154
|
-
} else {
|
|
4155
|
-
g.sigma = 1;
|
|
4156
|
-
}
|
|
4157
|
-
na_ndloop3(&ndf, &g, 1, self);
|
|
4158
|
-
return self;
|
|
4159
|
-
}
|
|
4160
|
-
|
|
4161
2362
|
static void iter_dcomplex_poly(na_loop_t* const lp) {
|
|
4162
2363
|
size_t i;
|
|
4163
2364
|
dtype x, y, a;
|
|
@@ -4281,26 +2482,109 @@ void Init_numo_dcomplex(void) {
|
|
|
4281
2482
|
rb_define_singleton_method(cT, "cast", dcomplex_s_cast, 1);
|
|
4282
2483
|
rb_define_method(cT, "[]", dcomplex_aref, -1);
|
|
4283
2484
|
rb_define_method(cT, "[]=", dcomplex_aset, -1);
|
|
2485
|
+
/**
|
|
2486
|
+
* return NArray with cast to the type of self.
|
|
2487
|
+
* @overload coerce_cast(type)
|
|
2488
|
+
* @return [nil]
|
|
2489
|
+
*/
|
|
4284
2490
|
rb_define_method(cT, "coerce_cast", dcomplex_coerce_cast, 1);
|
|
2491
|
+
/**
|
|
2492
|
+
* Convert self to Array.
|
|
2493
|
+
* @overload to_a
|
|
2494
|
+
* @return [Array]
|
|
2495
|
+
*/
|
|
4285
2496
|
rb_define_method(cT, "to_a", dcomplex_to_a, 0);
|
|
2497
|
+
/**
|
|
2498
|
+
* Fill elements with other.
|
|
2499
|
+
* @overload fill other
|
|
2500
|
+
* @param [Numeric] other
|
|
2501
|
+
* @return [Numo::DComplex] self.
|
|
2502
|
+
*/
|
|
4286
2503
|
rb_define_method(cT, "fill", dcomplex_fill, 1);
|
|
2504
|
+
/**
|
|
2505
|
+
* Format elements into strings.
|
|
2506
|
+
* @overload format format
|
|
2507
|
+
* @param [String] format
|
|
2508
|
+
* @return [Numo::RObject] array of formatted strings.
|
|
2509
|
+
*/
|
|
4287
2510
|
rb_define_method(cT, "format", dcomplex_format, -1);
|
|
2511
|
+
/**
|
|
2512
|
+
* Format elements into strings.
|
|
2513
|
+
* @overload format_to_a format
|
|
2514
|
+
* @param [String] format
|
|
2515
|
+
* @return [Array] array of formatted strings.
|
|
2516
|
+
*/
|
|
4288
2517
|
rb_define_method(cT, "format_to_a", dcomplex_format_to_a, -1);
|
|
2518
|
+
/**
|
|
2519
|
+
* Returns a string containing a human-readable representation of NArray.
|
|
2520
|
+
* @overload inspect
|
|
2521
|
+
* @return [String]
|
|
2522
|
+
*/
|
|
4289
2523
|
rb_define_method(cT, "inspect", dcomplex_inspect, 0);
|
|
4290
2524
|
rb_define_method(cT, "each", dcomplex_each, 0);
|
|
4291
2525
|
rb_define_method(cT, "map", dcomplex_map, 0);
|
|
4292
2526
|
rb_define_method(cT, "each_with_index", dcomplex_each_with_index, 0);
|
|
4293
2527
|
rb_define_method(cT, "map_with_index", dcomplex_map_with_index, 0);
|
|
4294
2528
|
rb_define_method(cT, "abs", dcomplex_abs, 0);
|
|
2529
|
+
/**
|
|
2530
|
+
* Binary add.
|
|
2531
|
+
* @overload + other
|
|
2532
|
+
* @param [Numo::NArray,Numeric] other
|
|
2533
|
+
* @return [Numo::NArray] self + other
|
|
2534
|
+
*/
|
|
4295
2535
|
rb_define_method(cT, "+", dcomplex_add, 1);
|
|
2536
|
+
/**
|
|
2537
|
+
* Binary sub.
|
|
2538
|
+
* @overload - other
|
|
2539
|
+
* @param [Numo::NArray,Numeric] other
|
|
2540
|
+
* @return [Numo::NArray] self - other
|
|
2541
|
+
*/
|
|
4296
2542
|
rb_define_method(cT, "-", dcomplex_sub, 1);
|
|
2543
|
+
/**
|
|
2544
|
+
* Binary mul.
|
|
2545
|
+
* @overload * other
|
|
2546
|
+
* @param [Numo::NArray,Numeric] other
|
|
2547
|
+
* @return [Numo::NArray] self * other
|
|
2548
|
+
*/
|
|
4297
2549
|
rb_define_method(cT, "*", dcomplex_mul, 1);
|
|
2550
|
+
/**
|
|
2551
|
+
* Binary div.
|
|
2552
|
+
* @overload / other
|
|
2553
|
+
* @param [Numo::NArray,Numeric] other
|
|
2554
|
+
* @return [Numo::NArray] self / other
|
|
2555
|
+
*/
|
|
4298
2556
|
rb_define_method(cT, "/", dcomplex_div, 1);
|
|
2557
|
+
/**
|
|
2558
|
+
* Binary power.
|
|
2559
|
+
* @overload ** other
|
|
2560
|
+
* @param [Numo::NArray,Numeric] other
|
|
2561
|
+
* @return [Numo::NArray] self to the other-th power.
|
|
2562
|
+
*/
|
|
4299
2563
|
rb_define_method(cT, "**", dcomplex_pow, 1);
|
|
4300
2564
|
rb_define_alias(cT, "pow", "**");
|
|
2565
|
+
/**
|
|
2566
|
+
* Unary minus.
|
|
2567
|
+
* @overload -@
|
|
2568
|
+
* @return [Numo::DComplex] minus of self.
|
|
2569
|
+
*/
|
|
4301
2570
|
rb_define_method(cT, "-@", dcomplex_minus, 0);
|
|
2571
|
+
/**
|
|
2572
|
+
* Unary reciprocal.
|
|
2573
|
+
* @overload reciprocal
|
|
2574
|
+
* @return [Numo::DComplex] reciprocal of self.
|
|
2575
|
+
*/
|
|
4302
2576
|
rb_define_method(cT, "reciprocal", dcomplex_reciprocal, 0);
|
|
2577
|
+
/**
|
|
2578
|
+
* Unary sign.
|
|
2579
|
+
* @overload sign
|
|
2580
|
+
* @return [Numo::DComplex] sign of self.
|
|
2581
|
+
*/
|
|
4303
2582
|
rb_define_method(cT, "sign", dcomplex_sign, 0);
|
|
2583
|
+
/**
|
|
2584
|
+
* Unary square.
|
|
2585
|
+
* @overload square
|
|
2586
|
+
* @return [Numo::DComplex] square of self.
|
|
2587
|
+
*/
|
|
4304
2588
|
rb_define_method(cT, "square", dcomplex_square, 0);
|
|
4305
2589
|
rb_define_method(cT, "conj", dcomplex_conj, 0);
|
|
4306
2590
|
rb_define_method(cT, "im", dcomplex_im, 0);
|
|
@@ -4313,20 +2597,88 @@ void Init_numo_dcomplex(void) {
|
|
|
4313
2597
|
rb_define_alias(cT, "imag=", "set_imag");
|
|
4314
2598
|
rb_define_alias(cT, "real=", "set_real");
|
|
4315
2599
|
rb_define_alias(cT, "conjugate", "conj");
|
|
2600
|
+
/**
|
|
2601
|
+
* Comparison eq other.
|
|
2602
|
+
* @overload eq other
|
|
2603
|
+
* @param [Numo::NArray,Numeric] other
|
|
2604
|
+
* @return [Numo::Bit] result of self eq other.
|
|
2605
|
+
*/
|
|
4316
2606
|
rb_define_method(cT, "eq", dcomplex_eq, 1);
|
|
2607
|
+
/**
|
|
2608
|
+
* Comparison ne other.
|
|
2609
|
+
* @overload ne other
|
|
2610
|
+
* @param [Numo::NArray,Numeric] other
|
|
2611
|
+
* @return [Numo::Bit] result of self ne other.
|
|
2612
|
+
*/
|
|
4317
2613
|
rb_define_method(cT, "ne", dcomplex_ne, 1);
|
|
2614
|
+
/**
|
|
2615
|
+
* Comparison nearly_eq other.
|
|
2616
|
+
* @overload nearly_eq other
|
|
2617
|
+
* @param [Numo::NArray,Numeric] other
|
|
2618
|
+
* @return [Numo::Bit] result of self nearly_eq other.
|
|
2619
|
+
*/
|
|
4318
2620
|
rb_define_method(cT, "nearly_eq", dcomplex_nearly_eq, 1);
|
|
4319
2621
|
rb_define_alias(cT, "close_to", "nearly_eq");
|
|
2622
|
+
/**
|
|
2623
|
+
* Unary floor.
|
|
2624
|
+
* @overload floor
|
|
2625
|
+
* @return [Numo::DComplex] floor of self.
|
|
2626
|
+
*/
|
|
4320
2627
|
rb_define_method(cT, "floor", dcomplex_floor, 0);
|
|
2628
|
+
/**
|
|
2629
|
+
* Unary round.
|
|
2630
|
+
* @overload round
|
|
2631
|
+
* @return [Numo::DComplex] round of self.
|
|
2632
|
+
*/
|
|
4321
2633
|
rb_define_method(cT, "round", dcomplex_round, 0);
|
|
2634
|
+
/**
|
|
2635
|
+
* Unary ceil.
|
|
2636
|
+
* @overload ceil
|
|
2637
|
+
* @return [Numo::DComplex] ceil of self.
|
|
2638
|
+
*/
|
|
4322
2639
|
rb_define_method(cT, "ceil", dcomplex_ceil, 0);
|
|
2640
|
+
/**
|
|
2641
|
+
* Unary trunc.
|
|
2642
|
+
* @overload trunc
|
|
2643
|
+
* @return [Numo::DComplex] trunc of self.
|
|
2644
|
+
*/
|
|
4323
2645
|
rb_define_method(cT, "trunc", dcomplex_trunc, 0);
|
|
2646
|
+
/**
|
|
2647
|
+
* Unary rint.
|
|
2648
|
+
* @overload rint
|
|
2649
|
+
* @return [Numo::DComplex] rint of self.
|
|
2650
|
+
*/
|
|
4324
2651
|
rb_define_method(cT, "rint", dcomplex_rint, 0);
|
|
4325
2652
|
rb_define_method(cT, "copysign", dcomplex_copysign, 1);
|
|
2653
|
+
/**
|
|
2654
|
+
* Condition of isnan.
|
|
2655
|
+
* @overload isnan
|
|
2656
|
+
* @return [Numo::Bit] Condition of isnan.
|
|
2657
|
+
*/
|
|
4326
2658
|
rb_define_method(cT, "isnan", dcomplex_isnan, 0);
|
|
2659
|
+
/**
|
|
2660
|
+
* Condition of isinf.
|
|
2661
|
+
* @overload isinf
|
|
2662
|
+
* @return [Numo::Bit] Condition of isinf.
|
|
2663
|
+
*/
|
|
4327
2664
|
rb_define_method(cT, "isinf", dcomplex_isinf, 0);
|
|
2665
|
+
/**
|
|
2666
|
+
* Condition of isposinf.
|
|
2667
|
+
* @overload isposinf
|
|
2668
|
+
* @return [Numo::Bit] Condition of isposinf.
|
|
2669
|
+
*/
|
|
4328
2670
|
rb_define_method(cT, "isposinf", dcomplex_isposinf, 0);
|
|
2671
|
+
/**
|
|
2672
|
+
* Condition of isneginf.
|
|
2673
|
+
* @overload isneginf
|
|
2674
|
+
* @return [Numo::Bit] Condition of isneginf.
|
|
2675
|
+
*/
|
|
4329
2676
|
rb_define_method(cT, "isneginf", dcomplex_isneginf, 0);
|
|
2677
|
+
/**
|
|
2678
|
+
* Condition of isfinite.
|
|
2679
|
+
* @overload isfinite
|
|
2680
|
+
* @return [Numo::Bit] Condition of isfinite.
|
|
2681
|
+
*/
|
|
4330
2682
|
rb_define_method(cT, "isfinite", dcomplex_isfinite, 0);
|
|
4331
2683
|
/**
|
|
4332
2684
|
* sum of self.
|
|
@@ -4496,6 +2848,36 @@ void Init_numo_dcomplex(void) {
|
|
|
4496
2848
|
* # [4, 3, 3, 2, 4, 2]
|
|
4497
2849
|
*/
|
|
4498
2850
|
rb_define_method(cT, "rand", dcomplex_rand, -1);
|
|
2851
|
+
/**
|
|
2852
|
+
* Generates random numbers from the normal distribution on self narray
|
|
2853
|
+
* using Box-Muller Transformation.
|
|
2854
|
+
* @overload rand_norm([mu,[sigma]])
|
|
2855
|
+
* @param [Numeric] mu mean of normal distribution. (default=0)
|
|
2856
|
+
* @param [Numeric] sigma standard deviation of normal distribution. (default=1)
|
|
2857
|
+
* @return [Numo::DComplex] self.
|
|
2858
|
+
* @example
|
|
2859
|
+
* Numo::DFloat.new(5,5).rand_norm
|
|
2860
|
+
* # => Numo::DFloat#shape=[5,5]
|
|
2861
|
+
* # [[-0.581255, -0.168354, 0.586895, -0.595142, -0.802802],
|
|
2862
|
+
* # [-0.326106, 0.282922, 1.68427, 0.918499, -0.0485384],
|
|
2863
|
+
* # [-0.464453, -0.992194, 0.413794, -0.60717, -0.699695],
|
|
2864
|
+
* # [-1.64168, 0.48676, -0.875871, -1.43275, 0.812172],
|
|
2865
|
+
* # [-0.209975, -0.103612, -0.878617, -1.42495, 1.0968]]
|
|
2866
|
+
*
|
|
2867
|
+
* Numo::DFloat.new(5,5).rand_norm(10,0.1)
|
|
2868
|
+
* # => Numo::DFloat#shape=[5,5]
|
|
2869
|
+
* # [[9.9019, 9.90339, 10.0826, 9.98384, 9.72861],
|
|
2870
|
+
* # [9.81507, 10.0272, 9.91445, 10.0568, 9.88923],
|
|
2871
|
+
* # [10.0234, 9.97874, 9.96011, 9.9006, 9.99964],
|
|
2872
|
+
* # [10.0186, 9.94598, 9.92236, 9.99811, 9.97003],
|
|
2873
|
+
* # [9.79266, 9.95044, 9.95212, 9.93692, 10.2027]]
|
|
2874
|
+
*
|
|
2875
|
+
* Numo::DComplex.new(3,3).rand_norm(5+5i)
|
|
2876
|
+
* # => Numo::DComplex#shape=[3,3]
|
|
2877
|
+
* # [[5.84303+4.40052i, 4.00984+6.08982i, 5.10979+5.13215i],
|
|
2878
|
+
* # [4.26477+3.99655i, 4.90052+5.00763i, 4.46607+2.3444i],
|
|
2879
|
+
* # [4.5528+7.11003i, 5.62117+6.69094i, 5.05443+5.35133i]]
|
|
2880
|
+
*/
|
|
4499
2881
|
rb_define_method(cT, "rand_norm", dcomplex_rand_norm, -1);
|
|
4500
2882
|
rb_define_method(cT, "poly", dcomplex_poly, -2);
|
|
4501
2883
|
rb_define_singleton_method(cT, "[]", dcomplex_s_cast, -2);
|