carray 3.0.6 → 3.0.7

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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +110 -0
  3. data/README.md +24 -3
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_group.c +6 -6
  6. data/ext/ca_binop_dispatch.c +8 -0
  7. data/ext/ca_binop_dispatch.h +1 -0
  8. data/ext/ca_categorical_iterator.c +7 -7
  9. data/ext/ca_kernel_iterator.h +6 -4
  10. data/ext/ca_obj_array.c +4 -4
  11. data/ext/ca_obj_bincmp.c +19 -3
  12. data/ext/ca_obj_binop.c +36 -11
  13. data/ext/ca_obj_bitarray.c +2 -4
  14. data/ext/ca_obj_bitfield.c +86 -4
  15. data/ext/ca_obj_byte_swap.c +2 -4
  16. data/ext/ca_obj_const_string.c +422 -257
  17. data/ext/ca_obj_face.c +71 -33
  18. data/ext/ca_obj_fake.c +112 -13
  19. data/ext/ca_obj_farray.c +7 -1
  20. data/ext/ca_obj_fixlen_string.c +51 -17
  21. data/ext/ca_obj_grid.c +12 -7
  22. data/ext/ca_obj_meld.c +5 -5
  23. data/ext/ca_obj_monop.c +65 -39
  24. data/ext/ca_obj_object.c +9 -9
  25. data/ext/ca_obj_reduce.c +2 -4
  26. data/ext/ca_obj_refer.c +104 -10
  27. data/ext/ca_obj_repeat.c +1 -1
  28. data/ext/ca_obj_roll.c +2 -4
  29. data/ext/ca_obj_select.c +8 -6
  30. data/ext/ca_obj_select_axis.c +8 -6
  31. data/ext/ca_obj_stack.c +5 -5
  32. data/ext/ca_obj_stride.c +46 -8
  33. data/ext/ca_obj_string.c +2 -2
  34. data/ext/ca_obj_tile.c +2 -4
  35. data/ext/ca_obj_triop.c +15 -12
  36. data/ext/ca_obj_window.c +22 -15
  37. data/ext/ca_op_ipower.c +63 -15
  38. data/ext/ca_op_powi.h +6 -29
  39. data/ext/ca_sort_kernels.h +3 -0
  40. data/ext/ca_sweep_engine.c +90 -23
  41. data/ext/ca_sweep_engine.h +5 -6
  42. data/ext/caframe_csv_reader.c +1 -1
  43. data/ext/carray.h +3 -1
  44. data/ext/carray_access.c +98 -39
  45. data/ext/carray_address_basis.c +98 -24
  46. data/ext/carray_broadcast.c +2 -2
  47. data/ext/carray_call_cfunc.c +5 -8
  48. data/ext/carray_cast.c +311 -37
  49. data/ext/carray_cast_func.rb +37 -5
  50. data/ext/carray_conversion.c +56 -2
  51. data/ext/carray_copy.c +24 -0
  52. data/ext/carray_core.c +69 -6
  53. data/ext/carray_count.c +28 -9
  54. data/ext/carray_element.c +9 -3
  55. data/ext/carray_factorize.c +11 -11
  56. data/ext/carray_histogram.c +2 -2
  57. data/ext/carray_index_classifier.c +7 -5
  58. data/ext/carray_internal.h +94 -0
  59. data/ext/carray_kernels_binop.c +55 -55
  60. data/ext/carray_kernels_init.c +14 -14
  61. data/ext/carray_kernels_monop.c +90 -140
  62. data/ext/carray_lazy.c +16 -1
  63. data/ext/carray_loop.c +9 -2
  64. data/ext/carray_mask.c +118 -11
  65. data/ext/carray_median_percentile.c +13 -8
  66. data/ext/carray_memory_view.c +41 -22
  67. data/ext/carray_operator.c +72 -11
  68. data/ext/carray_order.c +52 -9
  69. data/ext/carray_partition.c +1 -1
  70. data/ext/carray_random.c +1 -1
  71. data/ext/carray_round.c +24 -1
  72. data/ext/carray_scatter.c +4 -0
  73. data/ext/carray_segment.c +1 -1
  74. data/ext/carray_slab.c +13 -4
  75. data/ext/carray_sort.c +6 -3
  76. data/ext/carray_sort_kernel.c +24 -0
  77. data/ext/carray_struct.c +21 -6
  78. data/ext/carray_test.c +85 -39
  79. data/ext/carray_time_text.c +6 -0
  80. data/ext/carray_utils.c +124 -54
  81. data/ext/mk_call_cfunc.rb +6 -11
  82. data/ext/mkkernel.rb +37 -27
  83. data/ext/version.h +4 -4
  84. data/lib/carray/axis_group.rb +9 -6
  85. data/lib/carray/basics.rb +26 -8
  86. data/lib/carray/bincount_nd.rb +8 -2
  87. data/lib/carray/block_iterator.rb +48 -21
  88. data/lib/carray/categorical.rb +21 -8
  89. data/lib/carray/categorical_iterator.rb +2 -1
  90. data/lib/carray/conditional.rb +52 -4
  91. data/lib/carray/const_string.rb +74 -0
  92. data/lib/carray/construct.rb +2 -2
  93. data/lib/carray/core_extensions.rb +19 -68
  94. data/lib/carray/data_type_extension.rb +1 -0
  95. data/lib/carray/fixlen_string.rb +83 -1
  96. data/lib/carray/frame/column_verbs.rb +61 -6
  97. data/lib/carray/frame/concat.rb +50 -6
  98. data/lib/carray/frame/csv_parser.rb +13 -4
  99. data/lib/carray/frame/frame.rb +38 -6
  100. data/lib/carray/frame/group.rb +67 -40
  101. data/lib/carray/frame/io.rb +10 -5
  102. data/lib/carray/frame/join.rb +20 -6
  103. data/lib/carray/frame/records.rb +6 -4
  104. data/lib/carray/frame/reshape.rb +25 -5
  105. data/lib/carray/frame/verbs.rb +78 -25
  106. data/lib/carray/frame/windows.rb +30 -6
  107. data/lib/carray/fuse_source.rb +4 -2
  108. data/lib/carray/iterator.rb +8 -0
  109. data/lib/carray/key_windows.rb +10 -4
  110. data/lib/carray/lazy.rb +12 -17
  111. data/lib/carray/methods/bin.rb +3 -0
  112. data/lib/carray/methods/composition.rb +1 -1
  113. data/lib/carray/methods/factorize.rb +2 -0
  114. data/lib/carray/methods/gather_nd.rb +4 -1
  115. data/lib/carray/methods/is_in.rb +23 -3
  116. data/lib/carray/methods/locate_addr.rb +63 -12
  117. data/lib/carray/methods/repeat.rb +11 -1
  118. data/lib/carray/record_order.rb +35 -6
  119. data/lib/carray/runtime.rb +10 -0
  120. data/lib/carray/segment_iterator.rb +19 -16
  121. data/lib/carray/serialize.rb +22 -0
  122. data/lib/carray/slab_iterator.rb +1 -1
  123. data/lib/carray/stack.rb +3 -3
  124. data/lib/carray/string.rb +6 -6
  125. data/lib/carray/string_operation_extension.rb +25 -4
  126. data/lib/carray/struct_builder.rb +4 -1
  127. data/lib/carray/time.rb +190 -46
  128. data/lib/carray/window_iterator.rb +48 -12
  129. data/yard-stubs/ca_obj_bitfield.rb +4 -1
  130. data/yard-stubs/ca_obj_refer.rb +3 -0
  131. data/yard-stubs/ca_obj_window.rb +2 -1
  132. data/yard-stubs/carray_access.rb +4 -2
  133. data/yard-stubs/carray_cast.rb +6 -0
  134. data/yard-stubs/carray_count.rb +6 -3
  135. data/yard-stubs/carray_math.rb +5 -0
  136. data/yard-stubs/carray_order.rb +6 -0
  137. data/yard-stubs/carray_scatter.rb +2 -1
  138. data/yard-stubs/carray_test.rb +18 -5
  139. metadata +2 -2
@@ -23726,11 +23726,9 @@ ca_monop_deg_360_float32_t (ca_size_t n, boolean8_t *m,
23726
23726
  p1 = q1 + k*i1;
23727
23727
  p2 = q2 + k*i2;
23728
23728
  { {
23729
- double _a = (double)(*p1);
23730
- double _fa = _a / 360.0;
23731
- (*p2) = (_a >= 0)
23732
- ? (_fa - floor(_fa)) * 360.0
23733
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23729
+ double _fa = (double)(*p1) / 360.0;
23730
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23731
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23734
23732
  }
23735
23733
  }
23736
23734
  }
@@ -23754,11 +23752,9 @@ ca_monop_deg_360_float32_t (ca_size_t n, boolean8_t *m,
23754
23752
  for (k=0; k<n; k++) {
23755
23753
  p1 = r1 + k; p2 = r2 + k;
23756
23754
  { {
23757
- double _a = (double)(*p1);
23758
- double _fa = _a / 360.0;
23759
- (*p2) = (_a >= 0)
23760
- ? (_fa - floor(_fa)) * 360.0
23761
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23755
+ double _fa = (double)(*p1) / 360.0;
23756
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23757
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23762
23758
  }
23763
23759
  }
23764
23760
  }
@@ -23769,11 +23765,9 @@ ca_monop_deg_360_float32_t (ca_size_t n, boolean8_t *m,
23769
23765
  for (k=0; k<n; k++) {
23770
23766
  p1 = q1 + k; p2 = q2 + k;
23771
23767
  { {
23772
- double _a = (double)(*p1);
23773
- double _fa = _a / 360.0;
23774
- (*p2) = (_a >= 0)
23775
- ? (_fa - floor(_fa)) * 360.0
23776
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23768
+ double _fa = (double)(*p1) / 360.0;
23769
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23770
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23777
23771
  }
23778
23772
  }
23779
23773
  }
@@ -23782,11 +23776,9 @@ ca_monop_deg_360_float32_t (ca_size_t n, boolean8_t *m,
23782
23776
  for (k=0; k<n; k++) {
23783
23777
  p1 = q1 + k; p2 = q2 + k;
23784
23778
  { {
23785
- double _a = (double)(*p1);
23786
- double _fa = _a / 360.0;
23787
- (*p2) = (_a >= 0)
23788
- ? (_fa - floor(_fa)) * 360.0
23789
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23779
+ double _fa = (double)(*p1) / 360.0;
23780
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23781
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23790
23782
  }
23791
23783
  }
23792
23784
  }
@@ -23797,11 +23789,9 @@ ca_monop_deg_360_float32_t (ca_size_t n, boolean8_t *m,
23797
23789
  ca_u_float32_t *p2 = q2;
23798
23790
  for (k=0; k<n; k++) {
23799
23791
  { {
23800
- double _a = (double)(*p1);
23801
- double _fa = _a / 360.0;
23802
- (*p2) = (_a >= 0)
23803
- ? (_fa - floor(_fa)) * 360.0
23804
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23792
+ double _fa = (double)(*p1) / 360.0;
23793
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23794
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23805
23795
  }
23806
23796
  }
23807
23797
  p1 += i1; p2 += i2;
@@ -23827,11 +23817,9 @@ ca_monop_deg_360_float64_t (ca_size_t n, boolean8_t *m,
23827
23817
  p1 = q1 + k*i1;
23828
23818
  p2 = q2 + k*i2;
23829
23819
  { {
23830
- double _a = (double)(*p1);
23831
- double _fa = _a / 360.0;
23832
- (*p2) = (_a >= 0)
23833
- ? (_fa - floor(_fa)) * 360.0
23834
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23820
+ double _fa = (double)(*p1) / 360.0;
23821
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23822
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23835
23823
  }
23836
23824
  }
23837
23825
  }
@@ -23855,11 +23843,9 @@ ca_monop_deg_360_float64_t (ca_size_t n, boolean8_t *m,
23855
23843
  for (k=0; k<n; k++) {
23856
23844
  p1 = r1 + k; p2 = r2 + k;
23857
23845
  { {
23858
- double _a = (double)(*p1);
23859
- double _fa = _a / 360.0;
23860
- (*p2) = (_a >= 0)
23861
- ? (_fa - floor(_fa)) * 360.0
23862
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23846
+ double _fa = (double)(*p1) / 360.0;
23847
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23848
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23863
23849
  }
23864
23850
  }
23865
23851
  }
@@ -23870,11 +23856,9 @@ ca_monop_deg_360_float64_t (ca_size_t n, boolean8_t *m,
23870
23856
  for (k=0; k<n; k++) {
23871
23857
  p1 = q1 + k; p2 = q2 + k;
23872
23858
  { {
23873
- double _a = (double)(*p1);
23874
- double _fa = _a / 360.0;
23875
- (*p2) = (_a >= 0)
23876
- ? (_fa - floor(_fa)) * 360.0
23877
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23859
+ double _fa = (double)(*p1) / 360.0;
23860
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23861
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23878
23862
  }
23879
23863
  }
23880
23864
  }
@@ -23883,11 +23867,9 @@ ca_monop_deg_360_float64_t (ca_size_t n, boolean8_t *m,
23883
23867
  for (k=0; k<n; k++) {
23884
23868
  p1 = q1 + k; p2 = q2 + k;
23885
23869
  { {
23886
- double _a = (double)(*p1);
23887
- double _fa = _a / 360.0;
23888
- (*p2) = (_a >= 0)
23889
- ? (_fa - floor(_fa)) * 360.0
23890
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23870
+ double _fa = (double)(*p1) / 360.0;
23871
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23872
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23891
23873
  }
23892
23874
  }
23893
23875
  }
@@ -23898,11 +23880,9 @@ ca_monop_deg_360_float64_t (ca_size_t n, boolean8_t *m,
23898
23880
  ca_u_float64_t *p2 = q2;
23899
23881
  for (k=0; k<n; k++) {
23900
23882
  { {
23901
- double _a = (double)(*p1);
23902
- double _fa = _a / 360.0;
23903
- (*p2) = (_a >= 0)
23904
- ? (_fa - floor(_fa)) * 360.0
23905
- : (_fa - ceil(_fa) + 1.0) * 360.0;
23883
+ double _fa = (double)(*p1) / 360.0;
23884
+ (*p2) = (_fa - floor(_fa)) * 360.0;
23885
+ if ( (*p2) >= 360.0 ) (*p2) = 0.0; /* a tiny negative rounds to the top */
23906
23886
  }
23907
23887
  }
23908
23888
  p1 += i1; p2 += i2;
@@ -23930,10 +23910,9 @@ ca_monop_deg_360_VALUE (ca_size_t n, boolean8_t *m,
23930
23910
  { {
23931
23911
  VALUE _obj_arg = (*p1);
23932
23912
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
23933
- double _a = NUM2DBL(_obj_arg);
23934
- double _fa = _a / 360.0;
23935
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * 360.0
23936
- : (_fa - ceil(_fa) + 1.0) * 360.0);
23913
+ double _fa = NUM2DBL(_obj_arg) / 360.0;
23914
+ double _r = (_fa - floor(_fa)) * 360.0;
23915
+ (*p2) = DBL2NUM(_r >= 360.0 ? 0.0 : _r);
23937
23916
  } else {
23938
23917
  (*p2) = rb_funcall(_obj_arg, rb_intern("deg_360"), 0);
23939
23918
  }
@@ -23962,10 +23941,9 @@ ca_monop_deg_360_VALUE (ca_size_t n, boolean8_t *m,
23962
23941
  { {
23963
23942
  VALUE _obj_arg = (*p1);
23964
23943
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
23965
- double _a = NUM2DBL(_obj_arg);
23966
- double _fa = _a / 360.0;
23967
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * 360.0
23968
- : (_fa - ceil(_fa) + 1.0) * 360.0);
23944
+ double _fa = NUM2DBL(_obj_arg) / 360.0;
23945
+ double _r = (_fa - floor(_fa)) * 360.0;
23946
+ (*p2) = DBL2NUM(_r >= 360.0 ? 0.0 : _r);
23969
23947
  } else {
23970
23948
  (*p2) = rb_funcall(_obj_arg, rb_intern("deg_360"), 0);
23971
23949
  }
@@ -23981,10 +23959,9 @@ ca_monop_deg_360_VALUE (ca_size_t n, boolean8_t *m,
23981
23959
  { {
23982
23960
  VALUE _obj_arg = (*p1);
23983
23961
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
23984
- double _a = NUM2DBL(_obj_arg);
23985
- double _fa = _a / 360.0;
23986
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * 360.0
23987
- : (_fa - ceil(_fa) + 1.0) * 360.0);
23962
+ double _fa = NUM2DBL(_obj_arg) / 360.0;
23963
+ double _r = (_fa - floor(_fa)) * 360.0;
23964
+ (*p2) = DBL2NUM(_r >= 360.0 ? 0.0 : _r);
23988
23965
  } else {
23989
23966
  (*p2) = rb_funcall(_obj_arg, rb_intern("deg_360"), 0);
23990
23967
  }
@@ -23998,10 +23975,9 @@ ca_monop_deg_360_VALUE (ca_size_t n, boolean8_t *m,
23998
23975
  { {
23999
23976
  VALUE _obj_arg = (*p1);
24000
23977
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
24001
- double _a = NUM2DBL(_obj_arg);
24002
- double _fa = _a / 360.0;
24003
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * 360.0
24004
- : (_fa - ceil(_fa) + 1.0) * 360.0);
23978
+ double _fa = NUM2DBL(_obj_arg) / 360.0;
23979
+ double _r = (_fa - floor(_fa)) * 360.0;
23980
+ (*p2) = DBL2NUM(_r >= 360.0 ? 0.0 : _r);
24005
23981
  } else {
24006
23982
  (*p2) = rb_funcall(_obj_arg, rb_intern("deg_360"), 0);
24007
23983
  }
@@ -24017,10 +23993,9 @@ ca_monop_deg_360_VALUE (ca_size_t n, boolean8_t *m,
24017
23993
  { {
24018
23994
  VALUE _obj_arg = (*p1);
24019
23995
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
24020
- double _a = NUM2DBL(_obj_arg);
24021
- double _fa = _a / 360.0;
24022
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * 360.0
24023
- : (_fa - ceil(_fa) + 1.0) * 360.0);
23996
+ double _fa = NUM2DBL(_obj_arg) / 360.0;
23997
+ double _r = (_fa - floor(_fa)) * 360.0;
23998
+ (*p2) = DBL2NUM(_r >= 360.0 ? 0.0 : _r);
24024
23999
  } else {
24025
24000
  (*p2) = rb_funcall(_obj_arg, rb_intern("deg_360"), 0);
24026
24001
  }
@@ -24477,11 +24452,9 @@ ca_monop_rad_2pi_float32_t (ca_size_t n, boolean8_t *m,
24477
24452
  p2 = q2 + k*i2;
24478
24453
  { {
24479
24454
  double _two_pi = 2.0 * M_PI;
24480
- double _a = (double)(*p1);
24481
- double _fa = _a / _two_pi;
24482
- (*p2) = (_a >= 0)
24483
- ? (_fa - floor(_fa)) * _two_pi
24484
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24455
+ double _fa = (double)(*p1) / _two_pi;
24456
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24457
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24485
24458
  }
24486
24459
  }
24487
24460
  }
@@ -24506,11 +24479,9 @@ ca_monop_rad_2pi_float32_t (ca_size_t n, boolean8_t *m,
24506
24479
  p1 = r1 + k; p2 = r2 + k;
24507
24480
  { {
24508
24481
  double _two_pi = 2.0 * M_PI;
24509
- double _a = (double)(*p1);
24510
- double _fa = _a / _two_pi;
24511
- (*p2) = (_a >= 0)
24512
- ? (_fa - floor(_fa)) * _two_pi
24513
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24482
+ double _fa = (double)(*p1) / _two_pi;
24483
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24484
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24514
24485
  }
24515
24486
  }
24516
24487
  }
@@ -24522,11 +24493,9 @@ ca_monop_rad_2pi_float32_t (ca_size_t n, boolean8_t *m,
24522
24493
  p1 = q1 + k; p2 = q2 + k;
24523
24494
  { {
24524
24495
  double _two_pi = 2.0 * M_PI;
24525
- double _a = (double)(*p1);
24526
- double _fa = _a / _two_pi;
24527
- (*p2) = (_a >= 0)
24528
- ? (_fa - floor(_fa)) * _two_pi
24529
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24496
+ double _fa = (double)(*p1) / _two_pi;
24497
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24498
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24530
24499
  }
24531
24500
  }
24532
24501
  }
@@ -24536,11 +24505,9 @@ ca_monop_rad_2pi_float32_t (ca_size_t n, boolean8_t *m,
24536
24505
  p1 = q1 + k; p2 = q2 + k;
24537
24506
  { {
24538
24507
  double _two_pi = 2.0 * M_PI;
24539
- double _a = (double)(*p1);
24540
- double _fa = _a / _two_pi;
24541
- (*p2) = (_a >= 0)
24542
- ? (_fa - floor(_fa)) * _two_pi
24543
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24508
+ double _fa = (double)(*p1) / _two_pi;
24509
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24510
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24544
24511
  }
24545
24512
  }
24546
24513
  }
@@ -24552,11 +24519,9 @@ ca_monop_rad_2pi_float32_t (ca_size_t n, boolean8_t *m,
24552
24519
  for (k=0; k<n; k++) {
24553
24520
  { {
24554
24521
  double _two_pi = 2.0 * M_PI;
24555
- double _a = (double)(*p1);
24556
- double _fa = _a / _two_pi;
24557
- (*p2) = (_a >= 0)
24558
- ? (_fa - floor(_fa)) * _two_pi
24559
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24522
+ double _fa = (double)(*p1) / _two_pi;
24523
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24524
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24560
24525
  }
24561
24526
  }
24562
24527
  p1 += i1; p2 += i2;
@@ -24583,11 +24548,9 @@ ca_monop_rad_2pi_float64_t (ca_size_t n, boolean8_t *m,
24583
24548
  p2 = q2 + k*i2;
24584
24549
  { {
24585
24550
  double _two_pi = 2.0 * M_PI;
24586
- double _a = (double)(*p1);
24587
- double _fa = _a / _two_pi;
24588
- (*p2) = (_a >= 0)
24589
- ? (_fa - floor(_fa)) * _two_pi
24590
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24551
+ double _fa = (double)(*p1) / _two_pi;
24552
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24553
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24591
24554
  }
24592
24555
  }
24593
24556
  }
@@ -24612,11 +24575,9 @@ ca_monop_rad_2pi_float64_t (ca_size_t n, boolean8_t *m,
24612
24575
  p1 = r1 + k; p2 = r2 + k;
24613
24576
  { {
24614
24577
  double _two_pi = 2.0 * M_PI;
24615
- double _a = (double)(*p1);
24616
- double _fa = _a / _two_pi;
24617
- (*p2) = (_a >= 0)
24618
- ? (_fa - floor(_fa)) * _two_pi
24619
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24578
+ double _fa = (double)(*p1) / _two_pi;
24579
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24580
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24620
24581
  }
24621
24582
  }
24622
24583
  }
@@ -24628,11 +24589,9 @@ ca_monop_rad_2pi_float64_t (ca_size_t n, boolean8_t *m,
24628
24589
  p1 = q1 + k; p2 = q2 + k;
24629
24590
  { {
24630
24591
  double _two_pi = 2.0 * M_PI;
24631
- double _a = (double)(*p1);
24632
- double _fa = _a / _two_pi;
24633
- (*p2) = (_a >= 0)
24634
- ? (_fa - floor(_fa)) * _two_pi
24635
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24592
+ double _fa = (double)(*p1) / _two_pi;
24593
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24594
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24636
24595
  }
24637
24596
  }
24638
24597
  }
@@ -24642,11 +24601,9 @@ ca_monop_rad_2pi_float64_t (ca_size_t n, boolean8_t *m,
24642
24601
  p1 = q1 + k; p2 = q2 + k;
24643
24602
  { {
24644
24603
  double _two_pi = 2.0 * M_PI;
24645
- double _a = (double)(*p1);
24646
- double _fa = _a / _two_pi;
24647
- (*p2) = (_a >= 0)
24648
- ? (_fa - floor(_fa)) * _two_pi
24649
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24604
+ double _fa = (double)(*p1) / _two_pi;
24605
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24606
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24650
24607
  }
24651
24608
  }
24652
24609
  }
@@ -24658,11 +24615,9 @@ ca_monop_rad_2pi_float64_t (ca_size_t n, boolean8_t *m,
24658
24615
  for (k=0; k<n; k++) {
24659
24616
  { {
24660
24617
  double _two_pi = 2.0 * M_PI;
24661
- double _a = (double)(*p1);
24662
- double _fa = _a / _two_pi;
24663
- (*p2) = (_a >= 0)
24664
- ? (_fa - floor(_fa)) * _two_pi
24665
- : (_fa - ceil(_fa) + 1.0) * _two_pi;
24618
+ double _fa = (double)(*p1) / _two_pi;
24619
+ (*p2) = (_fa - floor(_fa)) * _two_pi;
24620
+ if ( (*p2) >= _two_pi ) (*p2) = 0.0; /* a tiny negative rounds to the top */
24666
24621
  }
24667
24622
  }
24668
24623
  p1 += i1; p2 += i2;
@@ -24691,10 +24646,9 @@ ca_monop_rad_2pi_VALUE (ca_size_t n, boolean8_t *m,
24691
24646
  VALUE _obj_arg = (*p1);
24692
24647
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
24693
24648
  double _two_pi = 2.0 * M_PI;
24694
- double _a = NUM2DBL(_obj_arg);
24695
- double _fa = _a / _two_pi;
24696
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * _two_pi
24697
- : (_fa - ceil(_fa) + 1.0) * _two_pi);
24649
+ double _fa = NUM2DBL(_obj_arg) / _two_pi;
24650
+ double _r = (_fa - floor(_fa)) * _two_pi;
24651
+ (*p2) = DBL2NUM(_r >= _two_pi ? 0.0 : _r);
24698
24652
  } else {
24699
24653
  (*p2) = rb_funcall(_obj_arg, rb_intern("rad_2pi"), 0);
24700
24654
  }
@@ -24724,10 +24678,9 @@ ca_monop_rad_2pi_VALUE (ca_size_t n, boolean8_t *m,
24724
24678
  VALUE _obj_arg = (*p1);
24725
24679
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
24726
24680
  double _two_pi = 2.0 * M_PI;
24727
- double _a = NUM2DBL(_obj_arg);
24728
- double _fa = _a / _two_pi;
24729
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * _two_pi
24730
- : (_fa - ceil(_fa) + 1.0) * _two_pi);
24681
+ double _fa = NUM2DBL(_obj_arg) / _two_pi;
24682
+ double _r = (_fa - floor(_fa)) * _two_pi;
24683
+ (*p2) = DBL2NUM(_r >= _two_pi ? 0.0 : _r);
24731
24684
  } else {
24732
24685
  (*p2) = rb_funcall(_obj_arg, rb_intern("rad_2pi"), 0);
24733
24686
  }
@@ -24744,10 +24697,9 @@ ca_monop_rad_2pi_VALUE (ca_size_t n, boolean8_t *m,
24744
24697
  VALUE _obj_arg = (*p1);
24745
24698
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
24746
24699
  double _two_pi = 2.0 * M_PI;
24747
- double _a = NUM2DBL(_obj_arg);
24748
- double _fa = _a / _two_pi;
24749
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * _two_pi
24750
- : (_fa - ceil(_fa) + 1.0) * _two_pi);
24700
+ double _fa = NUM2DBL(_obj_arg) / _two_pi;
24701
+ double _r = (_fa - floor(_fa)) * _two_pi;
24702
+ (*p2) = DBL2NUM(_r >= _two_pi ? 0.0 : _r);
24751
24703
  } else {
24752
24704
  (*p2) = rb_funcall(_obj_arg, rb_intern("rad_2pi"), 0);
24753
24705
  }
@@ -24762,10 +24714,9 @@ ca_monop_rad_2pi_VALUE (ca_size_t n, boolean8_t *m,
24762
24714
  VALUE _obj_arg = (*p1);
24763
24715
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
24764
24716
  double _two_pi = 2.0 * M_PI;
24765
- double _a = NUM2DBL(_obj_arg);
24766
- double _fa = _a / _two_pi;
24767
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * _two_pi
24768
- : (_fa - ceil(_fa) + 1.0) * _two_pi);
24717
+ double _fa = NUM2DBL(_obj_arg) / _two_pi;
24718
+ double _r = (_fa - floor(_fa)) * _two_pi;
24719
+ (*p2) = DBL2NUM(_r >= _two_pi ? 0.0 : _r);
24769
24720
  } else {
24770
24721
  (*p2) = rb_funcall(_obj_arg, rb_intern("rad_2pi"), 0);
24771
24722
  }
@@ -24782,10 +24733,9 @@ ca_monop_rad_2pi_VALUE (ca_size_t n, boolean8_t *m,
24782
24733
  VALUE _obj_arg = (*p1);
24783
24734
  if (RB_FLOAT_TYPE_P(_obj_arg) || RB_INTEGER_TYPE_P(_obj_arg) || RB_TYPE_P(_obj_arg, T_RATIONAL)) {
24784
24735
  double _two_pi = 2.0 * M_PI;
24785
- double _a = NUM2DBL(_obj_arg);
24786
- double _fa = _a / _two_pi;
24787
- (*p2) = DBL2NUM((_a >= 0) ? (_fa - floor(_fa)) * _two_pi
24788
- : (_fa - ceil(_fa) + 1.0) * _two_pi);
24736
+ double _fa = NUM2DBL(_obj_arg) / _two_pi;
24737
+ double _r = (_fa - floor(_fa)) * _two_pi;
24738
+ (*p2) = DBL2NUM(_r >= _two_pi ? 0.0 : _r);
24789
24739
  } else {
24790
24740
  (*p2) = rb_funcall(_obj_arg, rb_intern("rad_2pi"), 0);
24791
24741
  }
data/ext/carray_lazy.c CHANGED
@@ -788,6 +788,21 @@ ca_lazy_arena_acquire_object (ca_size_t n_elements)
788
788
  return ptr;
789
789
  }
790
790
 
791
+ /* The caller is about to overwrite a scratch's VALUEs with cells of another
792
+ data type: from here on they are not to be marked. */
793
+ void
794
+ ca_lazy_arena_untag_objects (void *ptr)
795
+ {
796
+ ca_lazy_arena_t *arena = ca_lazy_arena_get();
797
+ int i;
798
+ for ( i = 0; i < CA_LAZY_ARENA_SLOTS; i++ ) {
799
+ if ( arena->slots[i].ptr == ptr ) {
800
+ arena->slots[i].object_elements = 0;
801
+ return;
802
+ }
803
+ }
804
+ }
805
+
791
806
  static void
792
807
  ca_lazy_arena_mark_object_slots (ca_lazy_arena_t *arena)
793
808
  {
@@ -1286,7 +1301,7 @@ ca_mask_of_operands_func_clone (void *ap)
1286
1301
  static int
1287
1302
  ca_mask_of_operands_operand_is_scalar (CAMaskOfOperands *lm, CArray *op)
1288
1303
  {
1289
- return ( op->elements == 1 && lm->elements > 1 );
1304
+ return op->elements == 1;
1290
1305
  }
1291
1306
 
1292
1307
  static void
data/ext/carray_loop.c CHANGED
@@ -20,6 +20,7 @@ rb_ca_s_each_index_internal (int ndim, VALUE *dim, uint8_t indim, VALUE ridx)
20
20
  int32_t is_leaf = (indim == ndim - 1);
21
21
  ca_size_t i;
22
22
 
23
+ if ( ! NIL_P(dim[indim]) ) ca_integer_arg(dim[indim], "a dimension", "each_index");
23
24
  if ( NIL_P(dim[indim]) ) {
24
25
  rb_ary_store(ridx, indim, Qnil);
25
26
  if ( is_leaf ) {
@@ -140,15 +141,21 @@ rb_ca_index_walk (VALUE self, CArray *ca, int8_t level,
140
141
  that want the whole subscript should write |*idx|. */
141
142
  if ( mode & CA_LOOP_WITH_VALUE ) {
142
143
  int argc = (int)ca->ndim + 1;
143
- argv[0] = rb_ca_fetch_index(self, idx);
144
+ argv[0] = ( mode & CA_LOOP_STORE )
145
+ ? rb_ca_fetch_addr(self, ca_index2addr(ca, idx))
146
+ : rb_ca_fetch_index(self, idx);
144
147
  MEMCPY(argv + 1, RARRAY_CONST_PTR(ridx), VALUE, ca->ndim);
145
148
  obj = rb_yield_values2(argc, argv);
146
149
  }
147
150
  else {
148
151
  obj = rb_yield_values2((int)ca->ndim, RARRAY_CONST_PTR(ridx));
149
152
  }
153
+ /* map_index! writes in self's attach window. The buffer is what the
154
+ sync sends to the parent; a store by subscript goes past it to the
155
+ root and the sync then puts the old values back (rule R5). The
156
+ flat address reads and writes the buffer, as map! does. */
150
157
  if ( mode & CA_LOOP_STORE ) {
151
- rb_ca_store_index(self, idx, obj);
158
+ rb_ca_store_addr(self, ca_index2addr(ca, idx), obj);
152
159
  }
153
160
  ret = obj;
154
161
  }