numo-narray-alt 0.9.13 → 0.9.14

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/ext/numo/narray/numo/narray.h +2 -2
  3. data/ext/numo/narray/src/mh/abs.h +56 -0
  4. data/ext/numo/narray/src/mh/aref.h +28 -0
  5. data/ext/numo/narray/src/mh/arg.h +56 -0
  6. data/ext/numo/narray/src/mh/conj.h +71 -0
  7. data/ext/numo/narray/src/mh/copysign.h +97 -0
  8. data/ext/numo/narray/src/mh/each.h +71 -0
  9. data/ext/numo/narray/src/mh/each_with_index.h +98 -0
  10. data/ext/numo/narray/src/mh/extract.h +36 -0
  11. data/ext/numo/narray/src/mh/im.h +71 -0
  12. data/ext/numo/narray/src/mh/imag.h +56 -0
  13. data/ext/numo/narray/src/mh/kahan_sum.h +39 -0
  14. data/ext/numo/narray/src/mh/map.h +126 -0
  15. data/ext/numo/narray/src/mh/map_with_index.h +76 -0
  16. data/ext/numo/narray/src/mh/modf.h +35 -0
  17. data/ext/numo/narray/src/mh/poly.h +42 -0
  18. data/ext/numo/narray/src/mh/real.h +56 -0
  19. data/ext/numo/narray/src/mh/set_imag.h +60 -0
  20. data/ext/numo/narray/src/mh/set_real.h +60 -0
  21. data/ext/numo/narray/src/mh/signbit.h +42 -0
  22. data/ext/numo/narray/src/t_bit.c +63 -176
  23. data/ext/numo/narray/src/t_dcomplex.c +142 -1001
  24. data/ext/numo/narray/src/t_dfloat.c +24 -560
  25. data/ext/numo/narray/src/t_int16.c +83 -417
  26. data/ext/numo/narray/src/t_int32.c +83 -417
  27. data/ext/numo/narray/src/t_int64.c +83 -417
  28. data/ext/numo/narray/src/t_int8.c +83 -400
  29. data/ext/numo/narray/src/t_robject.c +83 -400
  30. data/ext/numo/narray/src/t_scomplex.c +130 -953
  31. data/ext/numo/narray/src/t_sfloat.c +22 -524
  32. data/ext/numo/narray/src/t_uint16.c +83 -417
  33. data/ext/numo/narray/src/t_uint32.c +83 -417
  34. data/ext/numo/narray/src/t_uint64.c +83 -417
  35. data/ext/numo/narray/src/t_uint8.c +83 -400
  36. metadata +21 -2
@@ -42,12 +42,19 @@ static ID id_to_a;
42
42
  VALUE cT;
43
43
  extern VALUE cRT;
44
44
 
45
+ #include "mh/extract.h"
46
+ #include "mh/aref.h"
45
47
  #include "mh/coerce_cast.h"
46
48
  #include "mh/to_a.h"
47
49
  #include "mh/fill.h"
48
50
  #include "mh/format.h"
49
51
  #include "mh/format_to_a.h"
50
52
  #include "mh/inspect.h"
53
+ #include "mh/each.h"
54
+ #include "mh/map.h"
55
+ #include "mh/each_with_index.h"
56
+ #include "mh/map_with_index.h"
57
+ #include "mh/abs.h"
51
58
  #include "mh/op/add.h"
52
59
  #include "mh/op/sub.h"
53
60
  #include "mh/op/mul.h"
@@ -64,6 +71,10 @@ extern VALUE cRT;
64
71
  #include "mh/round/ceil.h"
65
72
  #include "mh/round/trunc.h"
66
73
  #include "mh/round/rint.h"
74
+ #include "mh/copysign.h"
75
+ #include "mh/signbit.h"
76
+ #include "mh/modf.h"
77
+ #include "mh/kahan_sum.h"
67
78
  #include "mh/comp/eq.h"
68
79
  #include "mh/comp/ne.h"
69
80
  #include "mh/comp/nearly_eq.h"
@@ -101,6 +112,7 @@ extern VALUE cRT;
101
112
  #include "mh/eye.h"
102
113
  #include "mh/rand.h"
103
114
  #include "mh/rand_norm.h"
115
+ #include "mh/poly.h"
104
116
  #include "mh/math/sqrt.h"
105
117
  #include "mh/math/cbrt.h"
106
118
  #include "mh/math/log.h"
@@ -133,12 +145,19 @@ extern VALUE cRT;
133
145
 
134
146
  typedef double dfloat; // Type aliases for shorter notation
135
147
  // following the codebase naming convention.
148
+ DEF_NARRAY_EXTRACT_METHOD_FUNC(dfloat)
149
+ DEF_NARRAY_AREF_METHOD_FUNC(dfloat)
136
150
  DEF_NARRAY_COERCE_CAST_METHOD_FUNC(dfloat)
137
151
  DEF_NARRAY_TO_A_METHOD_FUNC(dfloat)
138
152
  DEF_NARRAY_FILL_METHOD_FUNC(dfloat)
139
153
  DEF_NARRAY_FORMAT_METHOD_FUNC(dfloat)
140
154
  DEF_NARRAY_FORMAT_TO_A_METHOD_FUNC(dfloat)
141
155
  DEF_NARRAY_INSPECT_METHOD_FUNC(dfloat)
156
+ DEF_NARRAY_EACH_METHOD_FUNC(dfloat)
157
+ DEF_NARRAY_MAP_METHOD_FUNC(dfloat, numo_cDFloat)
158
+ DEF_NARRAY_EACH_WITH_INDEX_METHOD_FUNC(dfloat)
159
+ DEF_NARRAY_MAP_WITH_INDEX_METHOD_FUNC(dfloat, numo_cDFloat)
160
+ DEF_NARRAY_ABS_METHOD_FUNC(dfloat, numo_cDFloat, dfloat, numo_cDFloat)
142
161
  #ifdef __SSE2__
143
162
  DEF_NARRAY_DFLT_ADD_SSE2_METHOD_FUNC()
144
163
  DEF_NARRAY_DFLT_SUB_SSE2_METHOD_FUNC()
@@ -162,6 +181,10 @@ DEF_NARRAY_FLT_ROUND_METHOD_FUNC(dfloat, numo_cDFloat)
162
181
  DEF_NARRAY_FLT_CEIL_METHOD_FUNC(dfloat, numo_cDFloat)
163
182
  DEF_NARRAY_FLT_TRUNC_METHOD_FUNC(dfloat, numo_cDFloat)
164
183
  DEF_NARRAY_FLT_RINT_METHOD_FUNC(dfloat, numo_cDFloat)
184
+ DEF_NARRAY_COPYSIGN_METHOD_FUNC(dfloat, numo_cDFloat)
185
+ DEF_NARRAY_SIGNBIT_METHOD_FUNC(dfloat, numo_cDFloat)
186
+ DEF_NARRAY_MODF_METHOD_FUNC(dfloat, numo_cDFloat)
187
+ DEF_NARRAY_KAHAN_SUM_METHOD_FUNC(dfloat, numo_cDFloat)
165
188
  DEF_NARRAY_EQ_METHOD_FUNC(dfloat, numo_cDFloat)
166
189
  DEF_NARRAY_NE_METHOD_FUNC(dfloat, numo_cDFloat)
167
190
  DEF_NARRAY_NEARLY_EQ_METHOD_FUNC(dfloat, numo_cDFloat)
@@ -199,6 +222,7 @@ DEF_NARRAY_FLT_LOGSEQ_METHOD_FUNC(dfloat)
199
222
  DEF_NARRAY_EYE_METHOD_FUNC(dfloat)
200
223
  DEF_NARRAY_FLT_RAND_METHOD_FUNC(dfloat)
201
224
  DEF_NARRAY_FLT_RAND_NORM_METHOD_FUNC(dfloat)
225
+ DEF_NARRAY_POLY_METHOD_FUNC(dfloat, numo_cDFloat)
202
226
  #ifdef __SSE2__
203
227
  DEF_NARRAY_FLT_SQRT_SSE2_DBL_METHOD_FUNC(dfloat, numo_cDFloat)
204
228
  #else
@@ -336,21 +360,6 @@ static VALUE dfloat_allocate(VALUE self) {
336
360
  return self;
337
361
  }
338
362
 
339
- static VALUE dfloat_extract(VALUE self) {
340
- volatile VALUE v;
341
- char* ptr;
342
- narray_t* na;
343
- GetNArray(self, na);
344
-
345
- if (na->ndim == 0) {
346
- ptr = na_get_pointer_for_read(self) + na_get_offset(self);
347
- v = m_extract(ptr);
348
- na_release_lock(self);
349
- return v;
350
- }
351
- return self;
352
- }
353
-
354
363
  static VALUE dfloat_new_dim0(dtype x) {
355
364
  VALUE v;
356
365
  dtype* ptr;
@@ -1314,20 +1323,6 @@ static VALUE dfloat_s_cast(VALUE type, VALUE obj) {
1314
1323
  return Qnil;
1315
1324
  }
1316
1325
 
1317
- static VALUE dfloat_aref(int argc, VALUE* argv, VALUE self) {
1318
- int nd;
1319
- size_t pos;
1320
- char* ptr;
1321
-
1322
- nd = na_get_result_dimension(self, argc, argv, sizeof(dtype), &pos);
1323
- if (nd) {
1324
- return na_aref_main(argc, argv, self, 0, nd);
1325
- } else {
1326
- ptr = na_get_pointer_for_read(self) + pos;
1327
- return m_extract(ptr);
1328
- }
1329
- }
1330
-
1331
1326
  static VALUE dfloat_aset(int argc, VALUE* argv, VALUE self) {
1332
1327
  int nd;
1333
1328
  size_t pos;
@@ -1352,537 +1347,6 @@ static VALUE dfloat_aset(int argc, VALUE* argv, VALUE self) {
1352
1347
  return argv[argc];
1353
1348
  }
1354
1349
 
1355
- static void iter_dfloat_each(na_loop_t* const lp) {
1356
- size_t i, s1;
1357
- char* p1;
1358
- size_t* idx1;
1359
- dtype x;
1360
- VALUE y;
1361
-
1362
- INIT_COUNTER(lp, i);
1363
- INIT_PTR_IDX(lp, 0, p1, s1, idx1);
1364
- if (idx1) {
1365
- for (; i--;) {
1366
- GET_DATA_INDEX(p1, idx1, dtype, x);
1367
- y = m_data_to_num(x);
1368
- rb_yield(y);
1369
- }
1370
- } else {
1371
- for (; i--;) {
1372
- GET_DATA_STRIDE(p1, s1, dtype, x);
1373
- y = m_data_to_num(x);
1374
- rb_yield(y);
1375
- }
1376
- }
1377
- }
1378
-
1379
- static VALUE dfloat_each(VALUE self) {
1380
- ndfunc_arg_in_t ain[1] = { { Qnil, 0 } };
1381
- ndfunc_t ndf = { iter_dfloat_each, FULL_LOOP_NIP, 1, 0, ain, 0 };
1382
-
1383
- na_ndloop(&ndf, 1, self);
1384
- return self;
1385
- }
1386
-
1387
- static void iter_dfloat_map(na_loop_t* const lp) {
1388
- size_t i, n;
1389
- char *p1, *p2;
1390
- ssize_t s1, s2;
1391
- size_t *idx1, *idx2;
1392
- dtype x;
1393
-
1394
- INIT_COUNTER(lp, n);
1395
- INIT_PTR_IDX(lp, 0, p1, s1, idx1);
1396
- INIT_PTR_IDX(lp, 1, p2, s2, idx2);
1397
-
1398
- if (idx1) {
1399
- if (idx2) {
1400
- for (i = 0; i < n; i++) {
1401
- GET_DATA_INDEX(p1, idx1, dtype, x);
1402
- x = m_map(x);
1403
- SET_DATA_INDEX(p2, idx2, dtype, x);
1404
- }
1405
- } else {
1406
- for (i = 0; i < n; i++) {
1407
- GET_DATA_INDEX(p1, idx1, dtype, x);
1408
- x = m_map(x);
1409
- SET_DATA_STRIDE(p2, s2, dtype, x);
1410
- }
1411
- }
1412
- } else {
1413
- if (idx2) {
1414
- for (i = 0; i < n; i++) {
1415
- GET_DATA_STRIDE(p1, s1, dtype, x);
1416
- x = m_map(x);
1417
- SET_DATA_INDEX(p2, idx2, dtype, x);
1418
- }
1419
- } else {
1420
- //
1421
- if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype))) {
1422
- if (s1 == sizeof(dtype) && s2 == sizeof(dtype)) {
1423
- for (i = 0; i < n; i++) {
1424
- ((dtype*)p2)[i] = m_map(((dtype*)p1)[i]);
1425
- }
1426
- return;
1427
- }
1428
- if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype))) {
1429
- //
1430
- for (i = 0; i < n; i++) {
1431
- *(dtype*)p2 = m_map(*(dtype*)p1);
1432
- p1 += s1;
1433
- p2 += s2;
1434
- }
1435
- return;
1436
- //
1437
- }
1438
- }
1439
- for (i = 0; i < n; i++) {
1440
- GET_DATA_STRIDE(p1, s1, dtype, x);
1441
- x = m_map(x);
1442
- SET_DATA_STRIDE(p2, s2, dtype, x);
1443
- }
1444
- //
1445
- }
1446
- }
1447
- }
1448
-
1449
- static VALUE dfloat_map(VALUE self) {
1450
- ndfunc_arg_in_t ain[1] = { { cT, 0 } };
1451
- ndfunc_arg_out_t aout[1] = { { cT, 0 } };
1452
- ndfunc_t ndf = { iter_dfloat_map, FULL_LOOP, 1, 1, ain, aout };
1453
-
1454
- return na_ndloop(&ndf, 1, self);
1455
- }
1456
-
1457
- static inline void yield_each_with_index(dtype x, size_t* c, VALUE* a, int nd, int md) {
1458
- int j;
1459
-
1460
- a[0] = m_data_to_num(x);
1461
- for (j = 0; j <= nd; j++) {
1462
- a[j + 1] = SIZET2NUM(c[j]);
1463
- }
1464
- rb_yield(rb_ary_new4(md, a));
1465
- }
1466
-
1467
- static void iter_dfloat_each_with_index(na_loop_t* const lp) {
1468
- size_t i, s1;
1469
- char* p1;
1470
- size_t* idx1;
1471
- dtype x;
1472
- VALUE* a;
1473
- size_t* c;
1474
- int nd, md;
1475
-
1476
- c = (size_t*)(lp->opt_ptr);
1477
- nd = lp->ndim;
1478
- if (nd > 0) {
1479
- nd--;
1480
- }
1481
- md = nd + 2;
1482
- a = ALLOCA_N(VALUE, md);
1483
-
1484
- INIT_COUNTER(lp, i);
1485
- INIT_PTR_IDX(lp, 0, p1, s1, idx1);
1486
- c[nd] = 0;
1487
- if (idx1) {
1488
- for (; i--;) {
1489
- GET_DATA_INDEX(p1, idx1, dtype, x);
1490
- yield_each_with_index(x, c, a, nd, md);
1491
- c[nd]++;
1492
- }
1493
- } else {
1494
- for (; i--;) {
1495
- GET_DATA_STRIDE(p1, s1, dtype, x);
1496
- yield_each_with_index(x, c, a, nd, md);
1497
- c[nd]++;
1498
- }
1499
- }
1500
- }
1501
-
1502
- static VALUE dfloat_each_with_index(VALUE self) {
1503
- ndfunc_arg_in_t ain[1] = { { Qnil, 0 } };
1504
- ndfunc_t ndf = { iter_dfloat_each_with_index, FULL_LOOP_NIP, 1, 0, ain, 0 };
1505
-
1506
- na_ndloop_with_index(&ndf, 1, self);
1507
- return self;
1508
- }
1509
-
1510
- static inline dtype yield_map_with_index(dtype x, size_t* c, VALUE* a, int nd, int md) {
1511
- int j;
1512
- VALUE y;
1513
-
1514
- a[0] = m_data_to_num(x);
1515
- for (j = 0; j <= nd; j++) {
1516
- a[j + 1] = SIZET2NUM(c[j]);
1517
- }
1518
- y = rb_yield(rb_ary_new4(md, a));
1519
- return m_num_to_data(y);
1520
- }
1521
-
1522
- static void iter_dfloat_map_with_index(na_loop_t* const lp) {
1523
- size_t i;
1524
- char *p1, *p2;
1525
- ssize_t s1, s2;
1526
- size_t *idx1, *idx2;
1527
- dtype x;
1528
- VALUE* a;
1529
- size_t* c;
1530
- int nd, md;
1531
-
1532
- c = (size_t*)(lp->opt_ptr);
1533
- nd = lp->ndim;
1534
- if (nd > 0) {
1535
- nd--;
1536
- }
1537
- md = nd + 2;
1538
- a = ALLOCA_N(VALUE, md);
1539
-
1540
- INIT_COUNTER(lp, i);
1541
- INIT_PTR_IDX(lp, 0, p1, s1, idx1);
1542
- INIT_PTR_IDX(lp, 1, p2, s2, idx2);
1543
-
1544
- c[nd] = 0;
1545
- if (idx1) {
1546
- if (idx2) {
1547
- for (; i--;) {
1548
- GET_DATA_INDEX(p1, idx1, dtype, x);
1549
- x = yield_map_with_index(x, c, a, nd, md);
1550
- SET_DATA_INDEX(p2, idx2, dtype, x);
1551
- c[nd]++;
1552
- }
1553
- } else {
1554
- for (; i--;) {
1555
- GET_DATA_INDEX(p1, idx1, dtype, x);
1556
- x = yield_map_with_index(x, c, a, nd, md);
1557
- SET_DATA_STRIDE(p2, s2, dtype, x);
1558
- c[nd]++;
1559
- }
1560
- }
1561
- } else {
1562
- if (idx2) {
1563
- for (; i--;) {
1564
- GET_DATA_STRIDE(p1, s1, dtype, x);
1565
- x = yield_map_with_index(x, c, a, nd, md);
1566
- SET_DATA_INDEX(p2, idx2, dtype, x);
1567
- c[nd]++;
1568
- }
1569
- } else {
1570
- for (; i--;) {
1571
- GET_DATA_STRIDE(p1, s1, dtype, x);
1572
- x = yield_map_with_index(x, c, a, nd, md);
1573
- SET_DATA_STRIDE(p2, s2, dtype, x);
1574
- c[nd]++;
1575
- }
1576
- }
1577
- }
1578
- }
1579
-
1580
- static VALUE dfloat_map_with_index(VALUE self) {
1581
- ndfunc_arg_in_t ain[1] = { { Qnil, 0 } };
1582
- ndfunc_arg_out_t aout[1] = { { cT, 0 } };
1583
- ndfunc_t ndf = { iter_dfloat_map_with_index, FULL_LOOP, 1, 1, ain, aout };
1584
-
1585
- return na_ndloop_with_index(&ndf, 1, self);
1586
- }
1587
-
1588
- static void iter_dfloat_abs(na_loop_t* const lp) {
1589
- size_t i;
1590
- char *p1, *p2;
1591
- ssize_t s1, s2;
1592
- size_t *idx1, *idx2;
1593
- dtype x;
1594
- rtype y;
1595
- INIT_COUNTER(lp, i);
1596
- INIT_PTR_IDX(lp, 0, p1, s1, idx1);
1597
- INIT_PTR_IDX(lp, 1, p2, s2, idx2);
1598
- if (idx1) {
1599
- if (idx2) {
1600
- for (; i--;) {
1601
- GET_DATA_INDEX(p1, idx1, dtype, x);
1602
- y = m_abs(x);
1603
- SET_DATA_INDEX(p2, idx2, rtype, y);
1604
- }
1605
- } else {
1606
- for (; i--;) {
1607
- GET_DATA_INDEX(p1, idx1, dtype, x);
1608
- y = m_abs(x);
1609
- SET_DATA_STRIDE(p2, s2, rtype, y);
1610
- }
1611
- }
1612
- } else {
1613
- if (idx2) {
1614
- for (; i--;) {
1615
- GET_DATA_STRIDE(p1, s1, dtype, x);
1616
- y = m_abs(x);
1617
- SET_DATA_INDEX(p2, idx2, rtype, y);
1618
- }
1619
- } else {
1620
- for (; i--;) {
1621
- GET_DATA_STRIDE(p1, s1, dtype, x);
1622
- y = m_abs(x);
1623
- SET_DATA_STRIDE(p2, s2, rtype, y);
1624
- }
1625
- }
1626
- }
1627
- }
1628
-
1629
- static VALUE dfloat_abs(VALUE self) {
1630
- ndfunc_arg_in_t ain[1] = { { cT, 0 } };
1631
- ndfunc_arg_out_t aout[1] = { { cRT, 0 } };
1632
- ndfunc_t ndf = { iter_dfloat_abs, FULL_LOOP, 1, 1, ain, aout };
1633
-
1634
- return na_ndloop(&ndf, 1, self);
1635
- }
1636
-
1637
- #define check_intdivzero(y) \
1638
- {}
1639
-
1640
- static void iter_dfloat_copysign(na_loop_t* const lp) {
1641
- size_t i = 0;
1642
- size_t n;
1643
- char *p1, *p2, *p3;
1644
- ssize_t s1, s2, s3;
1645
-
1646
- INIT_COUNTER(lp, n);
1647
- INIT_PTR(lp, 0, p1, s1);
1648
- INIT_PTR(lp, 1, p2, s2);
1649
- INIT_PTR(lp, 2, p3, s3);
1650
-
1651
- //
1652
- if (is_aligned(p1, sizeof(dtype)) && is_aligned(p2, sizeof(dtype)) &&
1653
- is_aligned(p3, sizeof(dtype))) {
1654
-
1655
- if (s1 == sizeof(dtype) && s2 == sizeof(dtype) && s3 == sizeof(dtype)) {
1656
- if (p1 == p3) { // inplace case
1657
- for (; i < n; i++) {
1658
- check_intdivzero(((dtype*)p2)[i]);
1659
- ((dtype*)p1)[i] = m_copysign(((dtype*)p1)[i], ((dtype*)p2)[i]);
1660
- }
1661
- } else {
1662
- for (; i < n; i++) {
1663
- check_intdivzero(((dtype*)p2)[i]);
1664
- ((dtype*)p3)[i] = m_copysign(((dtype*)p1)[i], ((dtype*)p2)[i]);
1665
- }
1666
- }
1667
- return;
1668
- }
1669
-
1670
- if (is_aligned_step(s1, sizeof(dtype)) && is_aligned_step(s2, sizeof(dtype)) &&
1671
- is_aligned_step(s3, sizeof(dtype))) {
1672
- //
1673
-
1674
- if (s2 == 0) { // Broadcasting from scalar value.
1675
- check_intdivzero(*(dtype*)p2);
1676
- if (s1 == sizeof(dtype) && s3 == sizeof(dtype)) {
1677
- if (p1 == p3) { // inplace case
1678
- for (; i < n; i++) {
1679
- ((dtype*)p1)[i] = m_copysign(((dtype*)p1)[i], *(dtype*)p2);
1680
- }
1681
- } else {
1682
- for (; i < n; i++) {
1683
- ((dtype*)p3)[i] = m_copysign(((dtype*)p1)[i], *(dtype*)p2);
1684
- }
1685
- }
1686
- } else {
1687
- for (i = 0; i < n; i++) {
1688
- *(dtype*)p3 = m_copysign(*(dtype*)p1, *(dtype*)p2);
1689
- p1 += s1;
1690
- p3 += s3;
1691
- }
1692
- }
1693
- } else {
1694
- if (p1 == p3) { // inplace case
1695
- for (i = 0; i < n; i++) {
1696
- check_intdivzero(*(dtype*)p2);
1697
- *(dtype*)p1 = m_copysign(*(dtype*)p1, *(dtype*)p2);
1698
- p1 += s1;
1699
- p2 += s2;
1700
- }
1701
- } else {
1702
- for (i = 0; i < n; i++) {
1703
- check_intdivzero(*(dtype*)p2);
1704
- *(dtype*)p3 = m_copysign(*(dtype*)p1, *(dtype*)p2);
1705
- p1 += s1;
1706
- p2 += s2;
1707
- p3 += s3;
1708
- }
1709
- }
1710
- }
1711
-
1712
- return;
1713
- //
1714
- }
1715
- }
1716
- for (i = 0; i < n; i++) {
1717
- dtype x, y, z;
1718
- GET_DATA_STRIDE(p1, s1, dtype, x);
1719
- GET_DATA_STRIDE(p2, s2, dtype, y);
1720
- check_intdivzero(y);
1721
- z = m_copysign(x, y);
1722
- SET_DATA_STRIDE(p3, s3, dtype, z);
1723
- }
1724
- //
1725
- }
1726
- #undef check_intdivzero
1727
-
1728
- static VALUE dfloat_copysign_self(VALUE self, VALUE other) {
1729
- ndfunc_arg_in_t ain[2] = { { cT, 0 }, { cT, 0 } };
1730
- ndfunc_arg_out_t aout[1] = { { cT, 0 } };
1731
- ndfunc_t ndf = { iter_dfloat_copysign, STRIDE_LOOP, 2, 1, ain, aout };
1732
-
1733
- return na_ndloop(&ndf, 2, self, other);
1734
- }
1735
-
1736
- static VALUE dfloat_copysign(VALUE self, VALUE other) {
1737
-
1738
- VALUE klass, v;
1739
-
1740
- klass = na_upcast(rb_obj_class(self), rb_obj_class(other));
1741
- if (klass == cT) {
1742
- return dfloat_copysign_self(self, other);
1743
- } else {
1744
- v = rb_funcall(klass, id_cast, 1, self);
1745
- return rb_funcall(v, id_copysign, 1, other);
1746
- }
1747
- }
1748
-
1749
- static void iter_dfloat_signbit(na_loop_t* const lp) {
1750
- size_t i;
1751
- char* p1;
1752
- BIT_DIGIT* a2;
1753
- size_t p2;
1754
- ssize_t s1, s2;
1755
- size_t* idx1;
1756
- dtype x;
1757
- BIT_DIGIT b;
1758
- INIT_COUNTER(lp, i);
1759
- INIT_PTR_IDX(lp, 0, p1, s1, idx1);
1760
- INIT_PTR_BIT(lp, 1, a2, p2, s2);
1761
- if (idx1) {
1762
- for (; i--;) {
1763
- GET_DATA_INDEX(p1, idx1, dtype, x);
1764
- b = (m_signbit(x)) ? 1 : 0;
1765
- STORE_BIT(a2, p2, b);
1766
- p2 += s2;
1767
- }
1768
- } else {
1769
- for (; i--;) {
1770
- GET_DATA_STRIDE(p1, s1, dtype, x);
1771
- b = (m_signbit(x)) ? 1 : 0;
1772
- STORE_BIT(a2, p2, b);
1773
- p2 += s2;
1774
- }
1775
- }
1776
- }
1777
-
1778
- static VALUE dfloat_signbit(VALUE self) {
1779
- ndfunc_arg_in_t ain[1] = { { cT, 0 } };
1780
- ndfunc_arg_out_t aout[1] = { { numo_cBit, 0 } };
1781
- ndfunc_t ndf = { iter_dfloat_signbit, FULL_LOOP, 1, 1, ain, aout };
1782
-
1783
- return na_ndloop(&ndf, 1, self);
1784
- }
1785
-
1786
- static void iter_dfloat_modf(na_loop_t* const lp) {
1787
- size_t i;
1788
- char *p1, *p2, *p3;
1789
- ssize_t s1, s2, s3;
1790
- dtype x, y, z;
1791
- INIT_COUNTER(lp, i);
1792
- INIT_PTR(lp, 0, p1, s1);
1793
- INIT_PTR(lp, 1, p2, s2);
1794
- INIT_PTR(lp, 2, p3, s3);
1795
- for (; i--;) {
1796
- GET_DATA_STRIDE(p1, s1, dtype, x);
1797
- m_modf(x, y, z);
1798
- SET_DATA_STRIDE(p2, s2, dtype, y);
1799
- SET_DATA_STRIDE(p3, s3, dtype, z);
1800
- }
1801
- }
1802
-
1803
- static VALUE dfloat_modf(VALUE self) {
1804
- ndfunc_arg_in_t ain[1] = { { cT, 0 } };
1805
- ndfunc_arg_out_t aout[2] = { { cT, 0 }, { cT, 0 } };
1806
- ndfunc_t ndf = { iter_dfloat_modf, STRIDE_LOOP, 1, 2, ain, aout };
1807
-
1808
- return na_ndloop(&ndf, 1, self);
1809
- }
1810
-
1811
- static void iter_dfloat_kahan_sum(na_loop_t* const lp) {
1812
- size_t n;
1813
- char *p1, *p2;
1814
- ssize_t s1;
1815
-
1816
- INIT_COUNTER(lp, n);
1817
- INIT_PTR(lp, 0, p1, s1);
1818
- p2 = lp->args[1].ptr + lp->args[1].iter[0].pos;
1819
-
1820
- *(dtype*)p2 = f_kahan_sum(n, p1, s1);
1821
- }
1822
- static void iter_dfloat_kahan_sum_nan(na_loop_t* const lp) {
1823
- size_t n;
1824
- char *p1, *p2;
1825
- ssize_t s1;
1826
-
1827
- INIT_COUNTER(lp, n);
1828
- INIT_PTR(lp, 0, p1, s1);
1829
- p2 = lp->args[1].ptr + lp->args[1].iter[0].pos;
1830
-
1831
- *(dtype*)p2 = f_kahan_sum_nan(n, p1, s1);
1832
- }
1833
-
1834
- static VALUE dfloat_kahan_sum(int argc, VALUE* argv, VALUE self) {
1835
- VALUE v, reduce;
1836
- ndfunc_arg_in_t ain[2] = { { cT, 0 }, { sym_reduce, 0 } };
1837
- ndfunc_arg_out_t aout[1] = { { cT, 0 } };
1838
- ndfunc_t ndf = { iter_dfloat_kahan_sum, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout };
1839
-
1840
- reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, iter_dfloat_kahan_sum_nan);
1841
-
1842
- v = na_ndloop(&ndf, 2, self, reduce);
1843
-
1844
- return dfloat_extract(v);
1845
- }
1846
-
1847
- static void iter_dfloat_poly(na_loop_t* const lp) {
1848
- size_t i;
1849
- dtype x, y, a;
1850
-
1851
- x = *(dtype*)(lp->args[0].ptr + lp->args[0].iter[0].pos);
1852
- i = lp->narg - 2;
1853
- y = *(dtype*)(lp->args[i].ptr + lp->args[i].iter[0].pos);
1854
- for (; --i;) {
1855
- y = m_mul(x, y);
1856
- a = *(dtype*)(lp->args[i].ptr + lp->args[i].iter[0].pos);
1857
- y = m_add(y, a);
1858
- }
1859
- i = lp->narg - 1;
1860
- *(dtype*)(lp->args[i].ptr + lp->args[i].iter[0].pos) = y;
1861
- }
1862
-
1863
- static VALUE dfloat_poly(VALUE self, VALUE args) {
1864
- int argc, i;
1865
- VALUE* argv;
1866
- volatile VALUE v, a;
1867
- ndfunc_arg_out_t aout[1] = { { cT, 0 } };
1868
- ndfunc_t ndf = { iter_dfloat_poly, NO_LOOP, 0, 1, 0, aout };
1869
-
1870
- argc = (int)RARRAY_LEN(args);
1871
- ndf.nin = argc + 1;
1872
- ndf.ain = ALLOCA_N(ndfunc_arg_in_t, argc + 1);
1873
- for (i = 0; i < argc + 1; i++) {
1874
- ndf.ain[i].type = cT;
1875
- }
1876
- argv = ALLOCA_N(VALUE, argc + 1);
1877
- argv[0] = self;
1878
- for (i = 0; i < argc; i++) {
1879
- argv[i + 1] = RARRAY_PTR(args)[i];
1880
- }
1881
- a = rb_ary_new4(argc + 1, argv);
1882
- v = na_ndloop2(&ndf, a);
1883
- return dfloat_extract(v);
1884
- }
1885
-
1886
1350
  /*
1887
1351
  qsort.c
1888
1352
  Ruby/Numo::NArray - Numerical Array class for Ruby