carray 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -25
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +1 -1
  5. data/NEWS.md +3 -0
  6. data/README.md +128 -44
  7. data/carray.gemspec +22 -24
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1208 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +125 -0
  15. data/ext/ca_binop_dispatch.h +159 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +241 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4321 -0
  26. data/ext/ca_kernel_iterator.h +2603 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +809 -0
  33. data/ext/ca_obj_binop.c +892 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +965 -0
  39. data/ext/ca_obj_face.c +670 -0
  40. data/ext/ca_obj_face.h +247 -0
  41. data/ext/ca_obj_fake.c +228 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +306 -0
  45. data/ext/ca_obj_grid.c +858 -440
  46. data/ext/ca_obj_meld.c +1034 -0
  47. data/ext/ca_obj_moncmp.c +569 -0
  48. data/ext/ca_obj_monop.c +1111 -0
  49. data/ext/ca_obj_object.c +774 -298
  50. data/ext/ca_obj_record.c +468 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +569 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +616 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1296 -0
  58. data/ext/ca_obj_shift.c +230 -792
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2501 -0
  62. data/ext/ca_obj_string.c +268 -0
  63. data/ext/ca_obj_tile.c +614 -0
  64. data/ext/ca_obj_time.c +546 -0
  65. data/ext/ca_obj_timedelta.c +435 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +746 -0
  68. data/ext/ca_obj_unbound_repeat.c +208 -241
  69. data/ext/ca_obj_window.c +1131 -563
  70. data/ext/ca_op_byte_swap.c +175 -0
  71. data/ext/ca_op_ipower.c +319 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +430 -0
  75. data/ext/ca_sweep_engine.h +157 -0
  76. data/ext/ca_transform_common.c +228 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +795 -402
  80. data/ext/carray_access.c +831 -711
  81. data/ext/carray_attribute.c +98 -330
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +283 -0
  84. data/ext/carray_call_cfunc.c +1360 -828
  85. data/ext/carray_call_cfunc.h +160 -0
  86. data/ext/carray_cast.c +1212 -301
  87. data/ext/carray_cast_func.rb +81 -40
  88. data/ext/carray_class.c +53 -63
  89. data/ext/carray_config.h +28 -0
  90. data/ext/carray_conversion.c +350 -346
  91. data/ext/carray_copy.c +156 -268
  92. data/ext/carray_core.c +1342 -199
  93. data/ext/carray_count.c +312 -0
  94. data/ext/carray_data_type.c +43 -19
  95. data/ext/carray_element.c +585 -213
  96. data/ext/carray_factorize.c +2542 -0
  97. data/ext/carray_generate.c +230 -559
  98. data/ext/carray_histogram.c +490 -0
  99. data/ext/carray_hold.c +228 -0
  100. data/ext/carray_index_classifier.c +1035 -0
  101. data/ext/carray_index_classifier.h +27 -0
  102. data/ext/carray_internal.h +120 -0
  103. data/ext/carray_kernels_bincmp.c +4445 -0
  104. data/ext/carray_kernels_binop.c +10979 -0
  105. data/ext/carray_kernels_init.c +36 -0
  106. data/ext/carray_kernels_map.c +3466 -0
  107. data/ext/carray_kernels_moncmp.c +2096 -0
  108. data/ext/carray_kernels_monop.c +18312 -0
  109. data/ext/carray_kernels_reduce_aggregate.c +25836 -0
  110. data/ext/carray_kernels_reduce_boolean.c +329 -0
  111. data/ext/carray_kernels_reduce_cumulative.c +14592 -0
  112. data/ext/carray_kernels_reduce_extreme.c +16947 -0
  113. data/ext/carray_kernels_reduce_variance.c +3909 -0
  114. data/ext/carray_kernels_scan.c +3692 -0
  115. data/ext/carray_kernels_search.c +32137 -0
  116. data/ext/carray_kernels_sort.c +10625 -0
  117. data/ext/carray_kernels_triop.c +1391 -0
  118. data/ext/carray_lazy.c +567 -0
  119. data/ext/carray_loop.c +88 -200
  120. data/ext/carray_mask.c +848 -154
  121. data/ext/carray_math_kernel.h +120 -0
  122. data/ext/carray_mathfunc.c +10 -241
  123. data/ext/carray_median_percentile.c +1257 -0
  124. data/ext/carray_memory_view.c +1625 -0
  125. data/ext/carray_operator.c +1526 -318
  126. data/ext/carray_order.c +664 -1394
  127. data/ext/carray_partition.c +416 -0
  128. data/ext/carray_random.c +518 -0
  129. data/ext/carray_scatter.c +357 -0
  130. data/ext/carray_slab.c +1219 -0
  131. data/ext/carray_slab.h +84 -0
  132. data/ext/carray_sort.c +829 -0
  133. data/ext/carray_sort_kernel.c +620 -0
  134. data/ext/carray_struct.c +695 -0
  135. data/ext/carray_test.c +343 -229
  136. data/ext/carray_undef.c +34 -17
  137. data/ext/carray_utils.c +175 -74
  138. data/ext/extconf.rb +216 -55
  139. data/ext/mk_call_cfunc.rb +480 -0
  140. data/ext/mkkernel.rb +8842 -0
  141. data/ext/ruby_carray.c +202 -101
  142. data/ext/version.h +4 -14
  143. data/ext/version.rb +5 -13
  144. data/lib/carray/arrow_tensor.rb +401 -0
  145. data/lib/carray/attribute.rb +166 -0
  146. data/lib/carray/autoload_carray.rb +220 -0
  147. data/lib/carray/autoload_method_extension.rb +44 -0
  148. data/lib/carray/axis_group.rb +711 -0
  149. data/lib/carray/basics.rb +481 -0
  150. data/lib/carray/bincount_nd.rb +358 -0
  151. data/lib/carray/block_iterator.rb +604 -0
  152. data/lib/carray/boolean_reduce.rb +109 -0
  153. data/lib/carray/categorical.rb +561 -0
  154. data/lib/carray/categorical_iterator.rb +1062 -0
  155. data/lib/carray/complex.rb +150 -0
  156. data/lib/carray/conditional.rb +216 -0
  157. data/lib/carray/const_string.rb +228 -0
  158. data/lib/carray/construct.rb +139 -328
  159. data/lib/carray/core_extensions.rb +240 -0
  160. data/lib/carray/data_type_extension.rb +233 -0
  161. data/lib/carray/fixlen_string.rb +95 -0
  162. data/lib/carray/frame/concat.rb +132 -0
  163. data/lib/carray/frame/convert.rb +95 -0
  164. data/lib/carray/frame/csv_parser.rb +211 -0
  165. data/lib/carray/frame/frame.rb +649 -0
  166. data/lib/carray/frame/group.rb +186 -0
  167. data/lib/carray/frame/io.rb +164 -0
  168. data/lib/carray/frame/join.rb +248 -0
  169. data/lib/carray/frame/records.rb +99 -0
  170. data/lib/carray/frame/sort.rb +113 -0
  171. data/lib/carray/frame/verbs.rb +299 -0
  172. data/lib/carray/frame.rb +16 -0
  173. data/lib/carray/histogram.rb +512 -0
  174. data/lib/carray/inspect.rb +37 -20
  175. data/lib/carray/iterator.rb +57 -349
  176. data/lib/carray/lazy.rb +889 -0
  177. data/lib/carray/mask_gap_fill.rb +200 -0
  178. data/lib/carray/math.rb +78 -342
  179. data/lib/carray/meld_reduce.rb +289 -0
  180. data/lib/carray/methods/align_addr.rb +116 -0
  181. data/lib/carray/methods/bin.rb +128 -0
  182. data/lib/carray/methods/bincount.rb +87 -0
  183. data/lib/carray/methods/bit_string.rb +92 -0
  184. data/lib/carray/methods/broadcast.rb +63 -0
  185. data/lib/carray/methods/choose.rb +39 -0
  186. data/lib/carray/methods/composition.rb +280 -0
  187. data/lib/carray/methods/gather_nd.rb +206 -0
  188. data/lib/carray/methods/index.rb +39 -0
  189. data/lib/carray/methods/insert_block.rb +99 -0
  190. data/lib/carray/methods/is_in.rb +141 -0
  191. data/lib/carray/methods/join.rb +90 -0
  192. data/lib/carray/methods/locate_addr.rb +47 -0
  193. data/lib/carray/methods/mask_duplicates.rb +41 -0
  194. data/lib/carray/methods/meshgrid.rb +91 -0
  195. data/lib/carray/methods/mode.rb +126 -0
  196. data/lib/carray/methods/nunique.rb +46 -0
  197. data/lib/carray/methods/resize.rb +56 -0
  198. data/lib/carray/methods/snap.rb +156 -0
  199. data/lib/carray/methods/string_format.rb +57 -0
  200. data/lib/carray/methods/unique.rb +47 -0
  201. data/lib/carray/methods/value_counts.rb +71 -0
  202. data/lib/carray/mkmf.rb +124 -101
  203. data/lib/carray/runtime.rb +108 -0
  204. data/lib/carray/serialize.rb +478 -167
  205. data/lib/carray/slab_iterator.rb +292 -0
  206. data/lib/carray/stack.rb +291 -0
  207. data/lib/carray/string.rb +56 -180
  208. data/lib/carray/string_operation_extension.rb +289 -0
  209. data/lib/carray/struct.rb +335 -323
  210. data/lib/carray/struct_builder.rb +697 -0
  211. data/lib/carray/table.rb +41 -2
  212. data/lib/carray/time.rb +2255 -38
  213. data/lib/carray/window_iterator.rb +655 -0
  214. data/lib/carray.rb +55 -57
  215. metadata +163 -130
  216. data/Rakefile +0 -51
  217. data/TODO.md +0 -18
  218. data/ext/ca_iter_block.c +0 -257
  219. data/ext/ca_iter_dimension.c +0 -299
  220. data/ext/ca_iter_window.c +0 -214
  221. data/ext/ca_obj_mapping.c +0 -644
  222. data/ext/carray_iterator.c +0 -641
  223. data/ext/carray_math.rb +0 -850
  224. data/ext/carray_numeric.c +0 -259
  225. data/ext/carray_sort_addr.c +0 -254
  226. data/ext/carray_stat.c +0 -2100
  227. data/ext/carray_stat_proc.rb +0 -1999
  228. data/ext/mkmath.rb +0 -741
  229. data/ext/ruby_ccomplex.c +0 -509
  230. data/ext/ruby_float_func.c +0 -86
  231. data/lib/carray/array.rb +0 -8
  232. data/lib/carray/autoload/autoload_base.rb +0 -19
  233. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  234. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  235. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  236. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  237. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  238. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  239. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  240. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  241. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  242. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  243. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  244. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  245. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  246. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  247. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  248. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  249. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  250. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  251. data/lib/carray/autoload.rb +0 -141
  252. data/lib/carray/basic.rb +0 -191
  253. data/lib/carray/broadcast.rb +0 -101
  254. data/lib/carray/compose.rb +0 -315
  255. data/lib/carray/convert.rb +0 -115
  256. data/lib/carray/info.rb +0 -110
  257. data/lib/carray/io/imagemagick.rb +0 -235
  258. data/lib/carray/mask.rb +0 -102
  259. data/lib/carray/math/histogram.rb +0 -177
  260. data/lib/carray/math/recurrence.rb +0 -93
  261. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  262. data/lib/carray/object/ca_obj_link.rb +0 -50
  263. data/lib/carray/object/ca_obj_pack.rb +0 -99
  264. data/lib/carray/obsolete.rb +0 -256
  265. data/lib/carray/ordering.rb +0 -181
  266. data/lib/carray/testing.rb +0 -51
  267. data/lib/carray/transform.rb +0 -109
  268. data/misc/Methods.ja.md +0 -182
  269. data/misc/NOTE +0 -51
  270. data/spec/Classes/CABitfield_spec.rb +0 -58
  271. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  272. data/spec/Classes/CABlock_spec.rb +0 -205
  273. data/spec/Classes/CAField_spec.rb +0 -39
  274. data/spec/Classes/CAGrid_spec.rb +0 -75
  275. data/spec/Classes/CAMap_spec.rb +0 -0
  276. data/spec/Classes/CAMapping_spec.rb +0 -105
  277. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  278. data/spec/Classes/CAObject_spec.rb +0 -33
  279. data/spec/Classes/CARefer_spec.rb +0 -93
  280. data/spec/Classes/CARepeat_spec.rb +0 -65
  281. data/spec/Classes/CASelect_spec.rb +0 -22
  282. data/spec/Classes/CAShift_spec.rb +0 -16
  283. data/spec/Classes/CAStruct_spec.rb +0 -71
  284. data/spec/Classes/CATranspose_spec.rb +0 -60
  285. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  286. data/spec/Classes/CAWindow_spec.rb +0 -54
  287. data/spec/Classes/CAWrap_spec.rb +0 -8
  288. data/spec/Classes/CArray_spec.rb +0 -184
  289. data/spec/Classes/CScalar_spec.rb +0 -55
  290. data/spec/Classes/ex1.rb +0 -46
  291. data/spec/Features/feature_130_spec.rb +0 -19
  292. data/spec/Features/feature_attributes_spec.rb +0 -280
  293. data/spec/Features/feature_boolean_spec.rb +0 -98
  294. data/spec/Features/feature_broadcast.rb +0 -116
  295. data/spec/Features/feature_cast_function.rb +0 -19
  296. data/spec/Features/feature_cast_spec.rb +0 -33
  297. data/spec/Features/feature_class_spec.rb +0 -84
  298. data/spec/Features/feature_complex_spec.rb +0 -42
  299. data/spec/Features/feature_composite_spec.rb +0 -124
  300. data/spec/Features/feature_convert_spec.rb +0 -46
  301. data/spec/Features/feature_copy_spec.rb +0 -123
  302. data/spec/Features/feature_creation_spec.rb +0 -84
  303. data/spec/Features/feature_element_spec.rb +0 -144
  304. data/spec/Features/feature_extream_spec.rb +0 -54
  305. data/spec/Features/feature_generate_spec.rb +0 -74
  306. data/spec/Features/feature_index_spec.rb +0 -69
  307. data/spec/Features/feature_mask_spec.rb +0 -580
  308. data/spec/Features/feature_math_spec.rb +0 -97
  309. data/spec/Features/feature_order_spec.rb +0 -146
  310. data/spec/Features/feature_ref_store_spec.rb +0 -209
  311. data/spec/Features/feature_serialization_spec.rb +0 -125
  312. data/spec/Features/feature_stat_spec.rb +0 -397
  313. data/spec/Features/feature_virtual_spec.rb +0 -48
  314. data/spec/Features/method_eq_spec.rb +0 -81
  315. data/spec/Features/method_is_nan_spec.rb +0 -12
  316. data/spec/Features/method_map_spec.rb +0 -54
  317. data/spec/Features/method_max_with.rb +0 -20
  318. data/spec/Features/method_min_with.rb +0 -19
  319. data/spec/Features/method_ne_spec.rb +0 -18
  320. data/spec/Features/method_project_spec.rb +0 -188
  321. data/spec/Features/method_ref_spec.rb +0 -27
  322. data/spec/Features/method_round_spec.rb +0 -11
  323. data/spec/Features/method_s_linspace_spec.rb +0 -48
  324. data/spec/Features/method_s_span_spec.rb +0 -14
  325. data/spec/Features/method_seq_spec.rb +0 -47
  326. data/spec/Features/method_sort_with.rb +0 -43
  327. data/spec/Features/method_sorted_with.rb +0 -29
  328. data/spec/Features/method_span_spec.rb +0 -42
  329. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  330. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  331. data/spec/spec_all.rb +0 -10
  332. data/utils/ca_ase.rb +0 -21
  333. data/utils/ca_methods.rb +0 -15
  334. data/utils/cast_checker.rb +0 -30
  335. data/utils/convert_test.rb +0 -73
  336. data/utils/extract_yard.rb +0 -22
  337. data/utils/guess_shape.rb +0 -76
  338. data/utils/monkey_patch_methods.rb +0 -62
  339. data/utils/remove_resource_fork.sh +0 -5
@@ -1,1999 +0,0 @@
1
- # -*- Mode: C; tab-width: 2; -*-
2
- # ----------------------------------------------------------------------------
3
- #
4
- # carray_stat_proc.rb
5
- #
6
- # This file is part of Ruby/CArray extension library.
7
- # You can redistribute it and/or modify it under the terms of
8
- # the Ruby Licence.
9
- #
10
- # Copyright (C) 2005 Hiroki Motoyoshi
11
- #
12
- # ----------------------------------------------------------------------------
13
-
14
- have_type_long_double = false
15
-
16
- open("carray_config.h") { |io|
17
- while line = io.gets
18
- case line
19
- when /HAVE_TYPE_LONG_DOUBLE *1/
20
- have_type_long_double = true
21
- end
22
- end
23
- }
24
-
25
- def macro_expand (text, values)
26
- text = text.clone
27
- values.each do |key, val|
28
- text.gsub!("<"+key+">", val)
29
- end
30
- return text
31
- end
32
-
33
- TYPEINFO = {
34
- 'boolean8_t' => {
35
- 'type' => "boolean8_t",
36
- 'zero' => '0',
37
- 'dat2type' => '',
38
- 'obj2type' => 'NUM2LONG',
39
- 'type2obj' => 'LONG2NUM',
40
- 'type2dbl' => '(float64_t)',
41
- 'int2type' => '',
42
- 'atype' => have_type_long_double ? 'long double' : 'double',
43
- 'azero' => '0.0',
44
- 'aone' => '1.0',
45
- 'atype2obj' => 'rb_float_new',
46
- 'eql' => "GEQ",
47
- 'op_type' => "c",
48
- },
49
- 'int8_t' => {
50
- 'type' => "int8_t",
51
- 'zero' => '0',
52
- 'dat2type' => '',
53
- 'obj2type' => 'NUM2LONG',
54
- 'type2obj' => 'LONG2NUM',
55
- 'type2dbl' => '(float64_t)',
56
- 'int2type' => '',
57
- 'atype' => have_type_long_double ? 'long double' : 'double',
58
- 'azero' => '0.0',
59
- 'aone' => '1.0',
60
- 'atype2obj' => 'rb_float_new',
61
- 'eql' => "GEQ",
62
- 'op_type' => "c",
63
- },
64
- 'uint8_t' => {
65
- 'type' => "uint8_t",
66
- 'zero' => '0',
67
- 'dat2type' => '',
68
- 'obj2type' => 'NUM2ULONG',
69
- 'type2obj' => 'ULONG2NUM',
70
- 'type2dbl' => '(float64_t)',
71
- 'int2type' => '',
72
- 'atype' => have_type_long_double ? 'long double' : 'double',
73
- 'azero' => '0.0',
74
- 'aone' => '1.0',
75
- 'atype2obj' => 'rb_float_new',
76
- 'eql' => "GEQ",
77
- 'op_type' => "c",
78
- },
79
- 'int16_t' => {
80
- 'type' => "int16_t",
81
- 'zero' => '0',
82
- 'dat2type' => '',
83
- 'obj2type' => 'NUM2LONG',
84
- 'type2obj' => 'LONG2NUM',
85
- 'type2dbl' => '(float64_t)',
86
- 'int2type' => '',
87
- 'atype' => have_type_long_double ? 'long double' : 'double',
88
- 'azero' => '0.0',
89
- 'aone' => '1.0',
90
- 'atype2obj' => 'rb_float_new',
91
- 'eql' => "GEQ",
92
- 'op_type' => "c",
93
- },
94
- 'uint16_t' => {
95
- 'type' => "uint16_t",
96
- 'zero' => '0',
97
- 'dat2type' => '',
98
- 'obj2type' => 'NUM2ULONG',
99
- 'type2obj' => 'ULONG2NUM',
100
- 'type2dbl' => '(float64_t)',
101
- 'int2type' => '',
102
- 'atype' => have_type_long_double ? 'long double' : 'double',
103
- 'azero' => '0.0',
104
- 'aone' => '1.0',
105
- 'atype2obj' => 'rb_float_new',
106
- 'eql' => "GEQ",
107
- 'op_type' => "c",
108
- },
109
- 'int32_t' => {
110
- 'type' => "int32_t",
111
- 'zero' => '0',
112
- 'dat2type' => '',
113
- 'obj2type' => 'NUM2LONG',
114
- 'type2obj' => 'LONG2NUM',
115
- 'type2dbl' => '(float64_t)',
116
- 'int2type' => '',
117
- 'atype' => have_type_long_double ? 'long double' : 'double',
118
- 'azero' => '0.0',
119
- 'aone' => '1.0',
120
- 'atype2obj' => 'rb_float_new',
121
- 'eql' => "GEQ",
122
- 'op_type' => "c",
123
- },
124
- 'uint32_t' => {
125
- 'type' => "uint32_t",
126
- 'zero' => '0',
127
- 'dat2type' => '',
128
- 'obj2type' => 'NUM2ULONG',
129
- 'type2obj' => 'ULONG2NUM',
130
- 'type2dbl' => '(float64_t)',
131
- 'int2type' => '',
132
- 'atype' => have_type_long_double ? 'long double' : 'double',
133
- 'azero' => '0.0',
134
- 'aone' => '1.0',
135
- 'atype2obj' => 'rb_float_new',
136
- 'eql' => "GEQ",
137
- 'op_type' => "c",
138
- },
139
- 'int64_t' => {
140
- 'type' => "int64_t",
141
- 'zero' => '0',
142
- 'dat2type' => '',
143
- 'obj2type' => 'NUM2LL',
144
- 'type2obj' => 'LL2NUM',
145
- 'type2dbl' => '(float64_t)',
146
- 'int2type' => '',
147
- 'atype' => have_type_long_double ? 'long double' : 'double',
148
- 'azero' => '0.0',
149
- 'aone' => '1.0',
150
- 'atype2obj' => 'rb_float_new',
151
- 'eql' => "GEQ",
152
- 'op_type' => "c",
153
- },
154
- 'uint64_t' => {
155
- 'type' => "uint64_t",
156
- 'zero' => '0',
157
- 'dat2type' => '',
158
- 'obj2type' => 'NUM2ULL',
159
- 'type2obj' => 'ULL2NUM',
160
- 'type2dbl' => '(float64_t)',
161
- 'int2type' => '',
162
- 'atype' => have_type_long_double ? 'long double' : 'double',
163
- 'azero' => '0.0',
164
- 'aone' => '1.0',
165
- 'atype2obj' => 'rb_float_new',
166
- 'eql' => "GEQ",
167
- 'op_type' => "c",
168
- },
169
- 'float32_t' => {
170
- 'type' => "float32_t",
171
- 'zero' => '0.0',
172
- 'dat2type' => '',
173
- 'obj2type' => 'NUM2DBL',
174
- 'type2obj' => 'rb_float_new',
175
- 'type2dbl' => '(float64_t)',
176
- 'int2type' => '',
177
- 'atype' => have_type_long_double ? 'long double' : 'double',
178
- 'azero' => '0.0',
179
- 'aone' => '1.0',
180
- 'atype2obj' => 'rb_float_new',
181
- 'eql' => "GEQ",
182
- 'op_type' => "c",
183
- },
184
- 'float64_t' => {
185
- 'type' => "float64_t",
186
- 'zero' => '0.0',
187
- 'dat2type' => '',
188
- 'obj2type' => 'NUM2DBL',
189
- 'type2obj' => 'rb_float_new',
190
- 'type2dbl' => '',
191
- 'int2type' => '',
192
- 'atype' => have_type_long_double ? 'long double' : 'double',
193
- 'azero' => '0.0',
194
- 'aone' => '1.0',
195
- 'atype2obj' => 'rb_float_new',
196
- 'eql' => "GEQ",
197
- 'op_type' => "c",
198
- },
199
- 'float128_t' => {
200
- 'type' => "float128_t",
201
- 'zero' => '0.0',
202
- 'dat2type' => '',
203
- 'obj2type' => 'NUM2DBL',
204
- 'type2obj' => 'rb_float_new',
205
- 'type2dbl' => '',
206
- 'int2type' => '',
207
- 'atype' => have_type_long_double ? 'long double' : 'double',
208
- 'azero' => '0.0',
209
- 'aone' => '1.0',
210
- 'atype2obj' => 'rb_float_new',
211
- 'eql' => "GEQ",
212
- 'op_type' => "c",
213
- },
214
- 'cmplx64_t' => {
215
- 'type' => "cmplx64_t",
216
- 'zero' => '0.0',
217
- 'dat2type' => '',
218
- 'obj2type' => 'NUM2CC',
219
- 'type2obj' => 'rb_ccomplex_new',
220
- 'type2dbl' => '',
221
- 'int2type' => '',
222
- 'atype' => 'cmplx128_t',
223
- 'azero' => '0.0',
224
- 'aone' => '1.0',
225
- 'atype2obj' => 'rb_ccomplex_new',
226
- 'eql' => "GEQ",
227
- 'op_type' => "c",
228
- },
229
- 'cmplx128_t' => {
230
- 'type' => "cmplx128_t",
231
- 'zero' => '0.0',
232
- 'dat2type' => '',
233
- 'obj2type' => 'NUM2CC',
234
- 'type2obj' => 'rb_ccomplex_new',
235
- 'type2dbl' => '',
236
- 'int2type' => '',
237
- 'atype' => 'cmplx128_t',
238
- 'azero' => '0.0',
239
- 'aone' => '1.0',
240
- 'atype2obj' => 'rb_ccomplex_new',
241
- 'eql' => "GEQ",
242
- 'op_type' => "c",
243
- },
244
- 'cmplx256_t' => {
245
- 'type' => "cmplx256_t",
246
- 'zero' => '0.0',
247
- 'dat2type' => '',
248
- 'obj2type' => 'NUM2CC',
249
- 'type2obj' => 'rb_ccomplex_new',
250
- 'type2dbl' => '',
251
- 'int2type' => '',
252
- 'atype' => 'cmplx128_t',
253
- 'azero' => '0.0',
254
- 'aone' => '1.0',
255
- 'atype2obj' => 'rb_ccomplex_new',
256
- 'eql' => "GEQ",
257
- 'op_type' => "c",
258
- },
259
- 'VALUE' => {
260
- 'type' => "VALUE",
261
- 'zero' => 'INT2NUM(0)',
262
- 'dat2type' => '',
263
- 'obj2type' => '',
264
- 'type2obj' => '',
265
- 'type2dbl' => 'NUM2DBL',
266
- 'int2type' => 'INT2NUM',
267
- 'atype' => 'VALUE',
268
- 'azero' => 'rb_float_new(0.0)',
269
- 'aone' => 'rb_float_new(1.0)',
270
- 'atype2obj' => '',
271
- 'eql' => "OEQ",
272
- 'op_type' => "VALUE",
273
- },
274
-
275
- }
276
-
277
- # --------------------------------------------------------------------------
278
- #
279
- # HEADER
280
- #
281
- # --------------------------------------------------------------------------
282
-
283
- header = <<HERE_END
284
- /* ---------------------------------------------------------------------------
285
-
286
- carray_stat_proc.c
287
-
288
- This file is part of Ruby/CArray extension library.
289
-
290
-
291
- This file is automatically generated from carray_stat_proc.rb
292
- Copyright (C) 2005-2020 Hiroki Motoyoshi
293
-
294
- ---------------------------------------------------------------------------- */
295
-
296
- #include <math.h>
297
- #include "ruby.h"
298
- #include "carray.h"
299
-
300
- typedef struct {
301
- ca_size_t offset;
302
- ca_size_t count;
303
- ca_size_t step;
304
- ca_size_t *addr;
305
- } CAStatIterator;
306
-
307
- typedef void (*ca_stat_proc_t)();
308
-
309
- #define iterator_rewind(it) \
310
- { \
311
- if ( (it)->step ) { \
312
- (it)->count = 0; \
313
- (it)->offset = (it)->addr[((it)->count)++]; \
314
- } \
315
- else { \
316
- (it)->offset = 0; \
317
- } \
318
- }
319
-
320
- #define iterator_succ(it) \
321
- { \
322
- if ( (it)->step ) { \
323
- (it)->offset = (it)->addr[((it)->count)++]; \
324
- } \
325
- else { \
326
- ((it)->offset)++; \
327
- } \
328
- }
329
-
330
- static ID id_lt, id_gt, id_plus, id_minus, id_star, id_quo;
331
-
332
- #define GEQ(x,y) ( (x) == (y) )
333
- #define OEQ(x,y) rb_equal((x),(y))
334
-
335
- #define lt_c(x, y) ( (x) < (y) )
336
- #define lt_VALUE(x, y) rb_funcall((x), id_lt, 1, (y))
337
-
338
- #define gt_c(x, y) ( (x) > (y) )
339
- #define gt_VALUE(x, y) rb_funcall((x), id_gt, 1, (y))
340
-
341
- #define add_c(x, y) ( (x) + (y) )
342
- #define add_VALUE(x, y) rb_funcall((x), id_plus, 1, (y))
343
-
344
- #define sub_c(x, y) ( (x) - (y) )
345
- #define sub_VALUE(x, y) rb_funcall((x), id_minus, 1, (y))
346
-
347
- #define mul_c(x, y) ( (x) * (y) )
348
- #define mul_VALUE(x, y) rb_funcall((x), id_star, 1, (y))
349
-
350
- #define div_c(x, y) ( (x) / (y) )
351
- #define div_VALUE(x, y) rb_funcall((x), id_quo, 1, (y))
352
-
353
- #define sqrt_c(x) sqrt(x)
354
- #define sqrt_VALUE(x) rb_funcall((x), rb_intern("sqrt"), 0)
355
-
356
- HERE_END
357
-
358
- puts header
359
-
360
-
361
- # --------------------------------------------------------------------------
362
- #
363
- # STAT Part 1
364
- #
365
- # --------------------------------------------------------------------------
366
-
367
-
368
- text = <<'HERE_END'
369
-
370
- /* ============================= */
371
- /* ca_proc_prod */
372
- /* ============================= */
373
-
374
- static void
375
- ca_proc_prod_<type> (ca_size_t elements, ca_size_t min_count,
376
- boolean8_t *m, void *ptr, CAStatIterator *it,
377
- int return_object, VALUE *retobj,
378
- boolean8_t *retmask, float64_t *retval)
379
- {
380
- volatile <atype> prod = <aone>;
381
- <type> *p = (<type> *) ptr;
382
- ca_size_t *a = (ca_size_t *) it;
383
- ca_size_t count = 0;
384
- ca_size_t i;
385
- iterator_rewind(it);
386
- if ( m ) {
387
- for (i=0; i<elements; i++) {
388
- if ( *(m + *a) ) {
389
- count++;
390
- }
391
- else {
392
- prod = mul_<op_type>(prod, (<atype>)<dat2type>(*(p + *a)));
393
- }
394
- iterator_succ(it);
395
- }
396
- }
397
- else {
398
- for (i=0; i<elements; i++) {
399
- prod = mul_<op_type>(prod, (<atype>)<dat2type>(*(p + *a)));
400
- iterator_succ(it);
401
- }
402
- }
403
- if ( return_object ) {
404
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(prod);
405
- }
406
- else {
407
- if ( retmask ) {
408
- *retmask = ( count > min_count ) ? 1 : 0;
409
- }
410
- *retval = <type2dbl>(prod);
411
- }
412
- }
413
-
414
- /* ============================= */
415
- /* ca_proc_count */
416
- /* ============================= */
417
-
418
- static void
419
- ca_proc_count_<type> (ca_size_t elements, ca_size_t min_count,
420
- boolean8_t *m, void *ptr, CAStatIterator *it,
421
- int return_object, VALUE *retobj,
422
- boolean8_t *retmask, ca_size_t *retval)
423
- {
424
- ca_size_t *a = (ca_size_t *) it;
425
- ca_size_t count = 0;
426
- ca_size_t i;
427
- iterator_rewind(it);
428
- if ( m ) {
429
- for (i=0; i<elements; i++) {
430
- if ( *(m + *a) ) {
431
- count++;
432
- }
433
- iterator_succ(it);
434
- }
435
- }
436
- if ( return_object ) {
437
- *retobj = ( count > min_count ) ? CA_UNDEF : SIZE2NUM(elements - count);
438
- }
439
- else {
440
- if ( retmask ) {
441
- *retmask = ( count > min_count ) ? 1 : 0;
442
- }
443
- *retval = elements - count;
444
- }
445
- }
446
-
447
- static void
448
- ca_proc_sum_<type> (ca_size_t elements, ca_size_t min_count,
449
- boolean8_t *m, void *ptr, CAStatIterator *it,
450
- int return_object, VALUE *retobj,
451
- boolean8_t *retmask, float64_t *retval)
452
- {
453
- volatile <atype> sum = <azero>;
454
- <type> *p = (<type> *) ptr;
455
- ca_size_t *a = (ca_size_t *)it;
456
- ca_size_t count = 0;
457
- ca_size_t i;
458
- iterator_rewind(it);
459
- if ( m ) {
460
- for (i=0; i<elements; i++) {
461
- if ( *(m + *a) ) {
462
- count++;
463
- }
464
- else {
465
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
466
- }
467
- iterator_succ(it);
468
- }
469
- }
470
- else {
471
- for (i=0; i<elements; i++) {
472
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
473
- iterator_succ(it);
474
- }
475
- }
476
- if ( return_object ) {
477
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(sum);
478
- }
479
- else {
480
- if ( retmask ) {
481
- *retmask = ( count > min_count ) ? 1 : 0;
482
- }
483
- *retval = <type2dbl>(sum);
484
- }
485
- }
486
-
487
-
488
- /* ============================= */
489
- /* ca_proc_mean */
490
- /* ============================= */
491
-
492
- static void
493
- ca_proc_mean_<type> (ca_size_t elements, ca_size_t min_count,
494
- boolean8_t *m, void *ptr, CAStatIterator *it,
495
- int return_object, VALUE *retobj,
496
- boolean8_t *retmask, float64_t *retval)
497
- {
498
- volatile <atype> sum = <azero>, ave;
499
- <type> *p = (<type> *) ptr;
500
- ca_size_t *a = (ca_size_t *) it;
501
- ca_size_t count = 0;
502
- ca_size_t i;
503
- iterator_rewind(it);
504
- if ( m ) {
505
- for (i=0; i<elements; i++) {
506
- if ( *(m + *a) ) {
507
- count++;
508
- }
509
- else {
510
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
511
- }
512
- iterator_succ(it);
513
- }
514
- }
515
- else {
516
- for (i=0; i<elements; i++) {
517
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
518
- iterator_succ(it);
519
- }
520
- }
521
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
522
- if ( return_object ) {
523
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(ave);
524
- }
525
- else {
526
- if ( retmask ) {
527
- *retmask = ( count > min_count ) ? 1 : 0;
528
- }
529
- *retval = <type2dbl>(ave);
530
- }
531
- }
532
-
533
- /* ============================= */
534
- /* ca_proc_variancep */
535
- /* ============================= */
536
-
537
- static void
538
- ca_proc_variancep_<type> (ca_size_t elements, ca_size_t min_count,
539
- boolean8_t *m, void *ptr, CAStatIterator *it,
540
- int return_object, VALUE *retobj,
541
- boolean8_t *retmask, float64_t *retval)
542
- {
543
- volatile <atype> sum = <azero>, sum2 = <azero>, ave, var, diff;
544
- <type> *p = (<type> *) ptr;
545
- ca_size_t *a = (ca_size_t *) it;
546
- ca_size_t count = 0;
547
- ca_size_t i;
548
- iterator_rewind(it);
549
- if ( m ) {
550
- for (i=0; i<elements; i++) {
551
- if ( *(m + *a) ) {
552
- count++;
553
- }
554
- else {
555
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
556
- }
557
- iterator_succ(it);
558
- }
559
- }
560
- else {
561
- for (i=0; i<elements; i++) {
562
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
563
- iterator_succ(it);
564
- }
565
- }
566
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
567
-
568
- iterator_rewind(it);
569
- if ( m ) {
570
- for (i=0; i<elements; i++) {
571
- if ( *(m + *a) ) {
572
- ;
573
- }
574
- else {
575
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
576
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
577
- }
578
- iterator_succ(it);
579
- }
580
- }
581
- else {
582
- for (i=0; i<elements; i++) {
583
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
584
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
585
- iterator_succ(it);
586
- }
587
- }
588
-
589
- var = div_<op_type>(sum2, (<atype>)<int2type>(elements-count));
590
-
591
- if ( return_object ) {
592
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(var);
593
- }
594
- else {
595
- if ( retmask ) {
596
- *retmask = ( count > min_count ) ? 1 : 0;
597
- }
598
- *retval = <type2dbl>(var);
599
- }
600
- }
601
-
602
- /* ============================= */
603
- /* ca_proc_stddevp */
604
- /* ============================= */
605
-
606
- static void
607
- ca_proc_stddevp_<type> (ca_size_t elements, ca_size_t min_count,
608
- boolean8_t *m, void *ptr, CAStatIterator *it,
609
- int return_object, VALUE *retobj,
610
- boolean8_t *retmask, float64_t *retval)
611
- {
612
- volatile <atype> sum = <azero>, sum2 = <azero>, ave, var, diff;
613
- <type> *p = (<type> *) ptr;
614
- ca_size_t *a = (ca_size_t *) it;
615
- ca_size_t count = 0;
616
- ca_size_t i;
617
- iterator_rewind(it);
618
- if ( m ) {
619
- for (i=0; i<elements; i++) {
620
- if ( *(m + *a) ) {
621
- count++;
622
- }
623
- else {
624
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
625
- }
626
- iterator_succ(it);
627
- }
628
- }
629
- else {
630
- for (i=0; i<elements; i++) {
631
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
632
- iterator_succ(it);
633
- }
634
- }
635
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
636
-
637
- iterator_rewind(it);
638
- if ( m ) {
639
- for (i=0; i<elements; i++) {
640
- if ( *(m + *a) ) {
641
- ;
642
- }
643
- else {
644
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
645
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
646
- }
647
- iterator_succ(it);
648
- }
649
- }
650
- else {
651
- for (i=0; i<elements; i++) {
652
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
653
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
654
- iterator_succ(it);
655
- }
656
- }
657
-
658
- var = div_<op_type>(sum2, (<atype>)<int2type>(elements-count));
659
-
660
- if ( return_object ) {
661
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(sqrt_<op_type>(var));
662
- }
663
- else {
664
- if ( retmask ) {
665
- *retmask = ( count > min_count ) ? 1 : 0;
666
- }
667
- *retval = <type2dbl>(sqrt_<op_type>(var));
668
- }
669
- }
670
-
671
- /* ============================= */
672
- /* ca_proc_variance */
673
- /* ============================= */
674
-
675
- static void
676
- ca_proc_variance_<type> (ca_size_t elements, ca_size_t min_count,
677
- boolean8_t *m, void *ptr, CAStatIterator *it,
678
- int return_object, VALUE *retobj,
679
- boolean8_t *retmask, float64_t *retval)
680
- {
681
- volatile <atype> sum = <azero>, sum2 = <azero>, ave, var, diff;
682
- <type> *p = (<type> *) ptr;
683
- ca_size_t *a = (ca_size_t *) it;
684
- ca_size_t count = 0;
685
- ca_size_t i;
686
- iterator_rewind(it);
687
- if ( m ) {
688
- for (i=0; i<elements; i++) {
689
- if ( *(m + *a) ) {
690
- count++;
691
- }
692
- else {
693
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
694
- }
695
- iterator_succ(it);
696
- }
697
- }
698
- else {
699
- for (i=0; i<elements; i++) {
700
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
701
- iterator_succ(it);
702
- }
703
- }
704
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
705
-
706
- iterator_rewind(it);
707
- if ( m ) {
708
- for (i=0; i<elements; i++) {
709
- if ( *(m + *a) ) {
710
- ;
711
- }
712
- else {
713
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
714
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
715
- }
716
- iterator_succ(it);
717
- }
718
- }
719
- else {
720
- for (i=0; i<elements; i++) {
721
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
722
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
723
- iterator_succ(it);
724
- }
725
- }
726
-
727
- var = div_<op_type>(sum2, (<atype>)<int2type>(elements-count-1));
728
-
729
- if ( return_object ) {
730
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(var);
731
- }
732
- else {
733
- if ( retmask ) {
734
- *retmask = ( count > min_count ) ? 1 : 0;
735
- }
736
- *retval = <type2dbl>(var);
737
- }
738
- }
739
-
740
- /* ============================= */
741
- /* ca_proc_stddev */
742
- /* ============================= */
743
-
744
- static void
745
- ca_proc_stddev_<type> (ca_size_t elements, ca_size_t min_count,
746
- boolean8_t *m, void *ptr, CAStatIterator *it,
747
- int return_object, VALUE *retobj,
748
- boolean8_t *retmask, float64_t *retval)
749
- {
750
- volatile <atype> sum = <azero>, sum2 = <azero>, ave, var, diff;
751
- <type> *p = (<type> *) ptr;
752
- ca_size_t *a = (ca_size_t *) it;
753
- ca_size_t count = 0;
754
- ca_size_t i;
755
- iterator_rewind(it);
756
- if ( m ) {
757
- for (i=0; i<elements; i++) {
758
- if ( *(m + *a) ) {
759
- count++;
760
- }
761
- else {
762
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
763
- }
764
- iterator_succ(it);
765
- }
766
- }
767
- else {
768
- for (i=0; i<elements; i++) {
769
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
770
- iterator_succ(it);
771
- }
772
- }
773
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
774
-
775
- iterator_rewind(it);
776
- if ( m ) {
777
- for (i=0; i<elements; i++) {
778
- if ( *(m + *a) ) {
779
- ;
780
- }
781
- else {
782
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
783
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
784
- }
785
- iterator_succ(it);
786
- }
787
- }
788
- else {
789
- for (i=0; i<elements; i++) {
790
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
791
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
792
- iterator_succ(it);
793
- }
794
- }
795
-
796
- var = div_<op_type>(sum2, (<atype>)<int2type>(elements-count-1));
797
-
798
- if ( return_object ) {
799
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(sqrt_<op_type>(var));
800
- }
801
- else {
802
- if ( retmask ) {
803
- *retmask = ( count > min_count ) ? 1 : 0;
804
- }
805
- *retval = <type2dbl>(sqrt_<op_type>(var));
806
- }
807
- }
808
-
809
- /* ============================= */
810
- /* ca_proc_min */
811
- /* ============================= */
812
-
813
- static void
814
- ca_proc_min_<type> (ca_size_t elements, ca_size_t min_count,
815
- boolean8_t *m, void *ptr, CAStatIterator *it,
816
- int return_object, VALUE *retobj,
817
- boolean8_t *retmask, <type> *retval)
818
- {
819
- <type> min = <zero>;
820
- <type> *p = (<type> *) ptr;
821
- ca_size_t *a = (ca_size_t *) it;
822
- ca_size_t count = 0;
823
- ca_size_t addr;
824
- ca_size_t i;
825
- iterator_rewind(it);
826
- if ( m ) {
827
- addr = -1;
828
- for (i=0; i<elements; i++) {
829
- if ( *(m + *a) ) {
830
- count++;
831
- }
832
- else {
833
- min = *(p + *a);
834
- addr = i;
835
- break;
836
- }
837
- iterator_succ(it);
838
- }
839
- iterator_succ(it);
840
- if ( addr >= 0 ) {
841
- for (i=addr+1; i<elements; i++) {
842
- if ( *(m + *a) ) {
843
- count++;
844
- }
845
- else {
846
- if ( lt_<op_type>(*(p + *a), min) ) {
847
- min = *(p + *a);
848
- addr = i;
849
- }
850
- }
851
- iterator_succ(it);
852
- }
853
- }
854
- }
855
- else {
856
- min = *(p + *a);
857
- addr = 0;
858
- for (i=addr; i<elements; i++) {
859
- if ( lt_<op_type>(*(p + *a), min) ) {
860
- min = *(p + *a);
861
- addr = i;
862
- }
863
- iterator_succ(it);
864
- }
865
- }
866
- if ( return_object ) {
867
- *retobj = ( count > min_count ) ? CA_UNDEF : <type2obj>(min);
868
- }
869
- else {
870
- if ( retmask ) {
871
- *retmask = ( count > min_count ) ? 1 : 0;
872
- }
873
- *retval = min;
874
- }
875
- }
876
-
877
- /* ============================= */
878
- /* ca_proc_min_addr */
879
- /* ============================= */
880
-
881
- static void
882
- ca_proc_min_addr_<type> (ca_size_t elements, ca_size_t min_count,
883
- boolean8_t *m, void *ptr, CAStatIterator *it,
884
- int return_object, VALUE *retobj,
885
- boolean8_t *retmask, ca_size_t *retval)
886
- {
887
- <type> min = <zero>;
888
- <type> *p = (<type> *) ptr;
889
- ca_size_t *a = (ca_size_t *) it;
890
- ca_size_t count = 0;
891
- ca_size_t addr;
892
- ca_size_t i;
893
- iterator_rewind(it);
894
- if ( m ) {
895
- addr = -1;
896
- for (i=0; i<elements; i++) {
897
- if ( *(m + *a) ) {
898
- count++;
899
- }
900
- else {
901
- min = *(p + *a);
902
- addr = i;
903
- break;
904
- }
905
- iterator_succ(it);
906
- }
907
- iterator_succ(it);
908
- if ( addr >= 0 ) {
909
- for (i=addr+1; i<elements; i++) {
910
- if ( *(m + *a) ) {
911
- count++;
912
- }
913
- else {
914
- if ( lt_<op_type>(*(p + *a), min) ) {
915
- min = *(p + *a);
916
- addr = i;
917
- }
918
- }
919
- iterator_succ(it);
920
- }
921
- }
922
- }
923
- else {
924
- min = *(p + *a);
925
- addr = 0;
926
- for (i=addr; i<elements; i++) {
927
- if ( lt_<op_type>(*(p + *a), min) ) {
928
- min = *(p + *a);
929
- addr = i;
930
- }
931
- iterator_succ(it);
932
- }
933
- }
934
- if ( return_object ) {
935
- *retobj = ( count > min_count ) ? CA_UNDEF
936
- : ( addr < 0 ) ? Qnil : SIZE2NUM(addr);
937
- }
938
- else {
939
- if ( retmask ) {
940
- *retmask = ( count > min_count ) ? 1 : 0;
941
- }
942
- *retval = addr;
943
- }
944
- }
945
-
946
- /* ============================= */
947
- /* ca_proc_max */
948
- /* ============================= */
949
-
950
- static void
951
- ca_proc_max_<type> (ca_size_t elements, ca_size_t min_count,
952
- boolean8_t *m, void *ptr, CAStatIterator *it,
953
- int return_object, VALUE *retobj,
954
- boolean8_t *retmask, <type> *retval)
955
- {
956
- <type> max = 0;
957
- <type> *p = (<type> *) ptr;
958
- ca_size_t *a = (ca_size_t *) it;
959
- ca_size_t count = 0;
960
- ca_size_t addr;
961
- ca_size_t i;
962
- iterator_rewind(it);
963
- if ( m ) {
964
- addr = -1;
965
- for (i=0; i<elements; i++) {
966
- if ( *(m + *a) ) {
967
- count++;
968
- }
969
- else {
970
- max = *(p + *a);
971
- addr = i;
972
- break;
973
- }
974
- iterator_succ(it);
975
- }
976
- iterator_succ(it);
977
- if ( addr >= 0 ) {
978
- for (i=addr+1; i<elements; i++) {
979
- if ( *(m + *a) ) {
980
- count++;
981
- }
982
- else {
983
- if ( gt_<op_type>(*(p + *a), max) ) {
984
- max = *(p + *a);
985
- addr = i;
986
- }
987
- }
988
- iterator_succ(it);
989
- }
990
- }
991
- }
992
- else {
993
- max = *(p + *a);
994
- addr = 0;
995
- for (i=addr; i<elements; i++) {
996
- if ( gt_<op_type>(*(p + *a), max) ) {
997
- max = *(p + *a);
998
- addr = i;
999
- }
1000
- iterator_succ(it);
1001
- }
1002
- }
1003
- if ( return_object ) {
1004
- *retobj = ( count > min_count ) ? CA_UNDEF : <type2obj>(max);
1005
- }
1006
- else {
1007
- if ( retmask ) {
1008
- *retmask = ( count > min_count ) ? 1 : 0;
1009
- }
1010
- *retval = max;
1011
- }
1012
- }
1013
-
1014
- /* ============================= */
1015
- /* ca_proc_max_addr */
1016
- /* ============================= */
1017
-
1018
- static void
1019
- ca_proc_max_addr_<type> (ca_size_t elements, ca_size_t min_count,
1020
- boolean8_t *m, void *ptr, CAStatIterator *it,
1021
- int return_object, VALUE *retobj,
1022
- boolean8_t *retmask, ca_size_t *retval)
1023
- {
1024
- <type> max = 0;
1025
- <type> *p = (<type> *) ptr;
1026
- ca_size_t *a = (ca_size_t *) it;
1027
- ca_size_t count = 0;
1028
- ca_size_t addr;
1029
- ca_size_t i;
1030
- iterator_rewind(it);
1031
- if ( m ) {
1032
- addr = -1;
1033
- for (i=0; i<elements; i++) {
1034
- if ( *(m + *a) ) {
1035
- count++;
1036
- }
1037
- else {
1038
- max = *(p + *a);
1039
- addr = i;
1040
- break;
1041
- }
1042
- iterator_succ(it);
1043
- }
1044
- iterator_succ(it);
1045
- if ( addr >= 0 ) {
1046
- for (i=addr+1; i<elements; i++) {
1047
- if ( *(m + *a) ) {
1048
- count++;
1049
- }
1050
- else {
1051
- if ( gt_<op_type>(*(p + *a), max) ) {
1052
- max = *(p + *a);
1053
- addr = i;
1054
- }
1055
- }
1056
- iterator_succ(it);
1057
- }
1058
- }
1059
- }
1060
- else {
1061
- max = *(p + *a);
1062
- addr = 0;
1063
- for (i=addr; i<elements; i++) {
1064
- if ( gt_<op_type>(*(p + *a), max) ) {
1065
- max = *(p + *a);
1066
- addr = i;
1067
- }
1068
- iterator_succ(it);
1069
- }
1070
- }
1071
- if ( return_object ) {
1072
- *retobj = ( count > min_count ) ? CA_UNDEF
1073
- : ( addr < 0 ) ? Qnil : SIZE2NUM(addr);
1074
- }
1075
- else {
1076
- if ( retmask ) {
1077
- *retmask = ( count > min_count ) ? 1 : 0;
1078
- }
1079
- *retval = addr;
1080
- }
1081
- }
1082
-
1083
-
1084
- /* ============================= */
1085
- /* ca_proc_cumcount */
1086
- /* ============================= */
1087
-
1088
- static void
1089
- ca_proc_cumcount_<type> (ca_size_t elements, ca_size_t min_count,
1090
- boolean8_t *m, void *ptr, CAStatIterator *it,
1091
- boolean8_t *retmask, ca_size_t *retval)
1092
- {
1093
- ca_size_t *a = (ca_size_t *) it;
1094
- ca_size_t count = 0;
1095
- ca_size_t i;
1096
- iterator_rewind(it);
1097
- if ( m ) {
1098
- for (i=0; i<elements; i++) {
1099
- if ( *(m + *a) ) {
1100
- count++;
1101
- }
1102
- if ( retmask ) {
1103
- if ( count > min_count ) {
1104
- *retmask = 1;
1105
- }
1106
- else {
1107
- *retmask = 0;
1108
- }
1109
- }
1110
- *retval = i + 1 - count;
1111
- retmask++; retval++;
1112
- iterator_succ(it);
1113
- }
1114
- }
1115
- else {
1116
- for (i=0; i<elements; i++) {
1117
- *retval = i+1;
1118
- retval++;
1119
- }
1120
- }
1121
- }
1122
-
1123
-
1124
- /* ============================= */
1125
- /* ca_proc_cumsum */
1126
- /* ============================= */
1127
-
1128
- static void
1129
- ca_proc_cumsum_<type> (ca_size_t elements, ca_size_t min_count,
1130
- boolean8_t *m, void *ptr, CAStatIterator *it,
1131
- boolean8_t *retmask, float64_t *retval)
1132
- {
1133
- volatile <atype> sum = <azero>;
1134
- <type> *p = (<type> *) ptr;
1135
- ca_size_t *a = (ca_size_t *) it;
1136
- ca_size_t count = 0;
1137
- ca_size_t i;
1138
- iterator_rewind(it);
1139
- if ( m ) {
1140
- for (i=0; i<elements; i++) {
1141
- if ( *(m + *a) ) {
1142
- count++;
1143
- }
1144
- else {
1145
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
1146
- }
1147
- if ( retmask ) {
1148
- if ( count > min_count ) {
1149
- *retmask = 1;
1150
- }
1151
- else {
1152
- *retmask = 0;
1153
- }
1154
- }
1155
- *retval = <type2dbl>(sum);
1156
- retmask++; retval++;
1157
- iterator_succ(it);
1158
- }
1159
- }
1160
- else {
1161
- for (i=0; i<elements; i++) {
1162
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
1163
- *retval = <type2dbl>(sum);
1164
- retval++;
1165
- iterator_succ(it);
1166
- }
1167
- }
1168
- }
1169
-
1170
- HERE_END
1171
-
1172
- puts macro_expand(text, TYPEINFO['boolean8_t'])
1173
- puts macro_expand(text, TYPEINFO['int8_t'])
1174
- puts macro_expand(text, TYPEINFO['uint8_t'])
1175
- puts macro_expand(text, TYPEINFO['int16_t'])
1176
- puts macro_expand(text, TYPEINFO['uint16_t'])
1177
- puts macro_expand(text, TYPEINFO['int32_t'])
1178
- puts macro_expand(text, TYPEINFO['uint32_t'])
1179
- puts macro_expand(text, TYPEINFO['int64_t'])
1180
- puts macro_expand(text, TYPEINFO['uint64_t'])
1181
- puts macro_expand(text, TYPEINFO['float32_t'])
1182
- puts macro_expand(text, TYPEINFO['float64_t'])
1183
- puts macro_expand(text, TYPEINFO['float128_t'])
1184
- # puts macro_expand(text, TYPEINFO['cmplx64_t'])
1185
- # puts macro_expand(text, TYPEINFO['cmplx128_t'])
1186
- # puts macro_expand(text, TYPEINFO['cmplx256_t'])
1187
- puts macro_expand(text, TYPEINFO['VALUE'])
1188
-
1189
- text = <<'HERE_END'
1190
- static ca_stat_proc_t
1191
- ca_proc_<name>[CA_NTYPE] = {
1192
- NULL,
1193
- ca_proc_<name>_boolean8_t,
1194
- ca_proc_<name>_int8_t,
1195
- ca_proc_<name>_uint8_t,
1196
- ca_proc_<name>_int16_t,
1197
- ca_proc_<name>_uint16_t,
1198
- ca_proc_<name>_int32_t,
1199
- ca_proc_<name>_uint32_t,
1200
- ca_proc_<name>_int64_t,
1201
- ca_proc_<name>_uint64_t,
1202
- ca_proc_<name>_float32_t,
1203
- ca_proc_<name>_float64_t,
1204
- ca_proc_<name>_float128_t,
1205
- NULL, /* ca_proc_<name>_cmplx64_t, */
1206
- NULL, /* ca_proc_<name>_cmplx128_t, */
1207
- NULL, /* ca_proc_<name>_cmplx256_t, */
1208
- ca_proc_<name>_VALUE,
1209
- };
1210
-
1211
- HERE_END
1212
-
1213
- puts macro_expand(text, "name" => "count")
1214
- puts macro_expand(text, "name" => "sum")
1215
- puts macro_expand(text, "name" => "mean")
1216
- puts macro_expand(text, "name" => "variancep")
1217
- puts macro_expand(text, "name" => "stddevp")
1218
- puts macro_expand(text, "name" => "variance")
1219
- puts macro_expand(text, "name" => "stddev")
1220
- puts macro_expand(text, "name" => "prod")
1221
- puts macro_expand(text, "name" => "min")
1222
- puts macro_expand(text, "name" => "min_addr")
1223
- puts macro_expand(text, "name" => "max")
1224
- puts macro_expand(text, "name" => "max_addr")
1225
-
1226
- puts macro_expand(text, "name" => "cumcount")
1227
- puts macro_expand(text, "name" => "cumsum")
1228
-
1229
- # --------------------------------------------------------------------------
1230
- #
1231
- # STAT Part 2
1232
- #
1233
- # --------------------------------------------------------------------------
1234
-
1235
- text = <<'HERE_END'
1236
-
1237
- /* ============================= */
1238
- /* ca_proc_accum */
1239
- /* ============================= */
1240
-
1241
- static void
1242
- ca_proc_accum_<type> (ca_size_t elements, ca_size_t min_count,
1243
- boolean8_t *m, void *ptr, CAStatIterator *it,
1244
- int return_object, VALUE *retobj,
1245
- boolean8_t *retmask, <type> *retval)
1246
- {
1247
- <type> sum = <zero>;
1248
- <type> *p = (<type> *) ptr;
1249
- ca_size_t *a = (ca_size_t *) it;
1250
- ca_size_t count = 0;
1251
- ca_size_t i;
1252
- iterator_rewind(it);
1253
- if ( m ) {
1254
- for (i=0; i<elements; i++) {
1255
- if ( *(m + *a) ) {
1256
- count++;
1257
- }
1258
- else {
1259
- sum = add_<op_type>(sum, (<type>)<dat2type>(*(p + *a)));
1260
- }
1261
- iterator_succ(it);
1262
- }
1263
- }
1264
- else {
1265
- for (i=0; i<elements; i++) {
1266
- sum = add_<op_type>(sum, (<type>)<dat2type>(*(p + *a)));
1267
- iterator_succ(it);
1268
- }
1269
- }
1270
- if ( return_object ) {
1271
- *retobj = ( count > min_count ) ? CA_UNDEF : <type2obj>(sum);
1272
- }
1273
- else {
1274
- if ( retmask ) {
1275
- *retmask = ( count > min_count ) ? 1 : 0;
1276
- }
1277
- *retval = sum;
1278
- }
1279
- }
1280
-
1281
- HERE_END
1282
-
1283
- puts macro_expand(text, TYPEINFO['boolean8_t'])
1284
- puts macro_expand(text, TYPEINFO['int8_t'])
1285
- puts macro_expand(text, TYPEINFO['uint8_t'])
1286
- puts macro_expand(text, TYPEINFO['int16_t'])
1287
- puts macro_expand(text, TYPEINFO['uint16_t'])
1288
- puts macro_expand(text, TYPEINFO['int32_t'])
1289
- puts macro_expand(text, TYPEINFO['uint32_t'])
1290
- puts macro_expand(text, TYPEINFO['int64_t'])
1291
- puts macro_expand(text, TYPEINFO['uint64_t'])
1292
- puts macro_expand(text, TYPEINFO['float32_t'])
1293
- puts macro_expand(text, TYPEINFO['float64_t'])
1294
- puts macro_expand(text, TYPEINFO['float128_t'])
1295
- puts macro_expand(text, TYPEINFO['cmplx64_t'])
1296
- puts macro_expand(text, TYPEINFO['cmplx128_t'])
1297
- puts macro_expand(text, TYPEINFO['cmplx256_t'])
1298
- puts macro_expand(text, TYPEINFO['VALUE'])
1299
-
1300
- text = <<'HERE_END'
1301
- static ca_stat_proc_t
1302
- ca_proc_<name>[CA_NTYPE] = {
1303
- NULL,
1304
- ca_proc_<name>_boolean8_t,
1305
- ca_proc_<name>_int8_t,
1306
- ca_proc_<name>_uint8_t,
1307
- ca_proc_<name>_int16_t,
1308
- ca_proc_<name>_uint16_t,
1309
- ca_proc_<name>_int32_t,
1310
- ca_proc_<name>_uint32_t,
1311
- ca_proc_<name>_int64_t,
1312
- ca_proc_<name>_uint64_t,
1313
- ca_proc_<name>_float32_t,
1314
- ca_proc_<name>_float64_t,
1315
- ca_proc_<name>_float128_t,
1316
- ca_proc_<name>_cmplx64_t,
1317
- ca_proc_<name>_cmplx128_t,
1318
- ca_proc_<name>_cmplx256_t,
1319
- ca_proc_<name>_VALUE,
1320
- };
1321
-
1322
- HERE_END
1323
-
1324
- puts macro_expand(text, "name" => "accum")
1325
-
1326
- # --------------------------------------------------------------------------
1327
- #
1328
- # METHOD DEFINITIONS (after __END__)
1329
- #
1330
- # --------------------------------------------------------------------------
1331
-
1332
- puts DATA.read
1333
-
1334
- __END__
1335
-
1336
- static VALUE
1337
- rb_ca_stat_1d (VALUE self, VALUE rmc, VALUE vfval,
1338
- ca_stat_proc_t *ca_proc)
1339
- {
1340
- volatile VALUE out;
1341
- CArray *ca;
1342
- CAStatIterator it;
1343
- boolean8_t *m;
1344
- ca_size_t mc;
1345
-
1346
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1347
-
1348
- if ( ! ca_proc[ca->data_type] ) {
1349
- rb_raise(rb_eCADataTypeError,
1350
- "this method is not implemented for data_type %s",
1351
- ca_type_name[ca->data_type]);
1352
- }
1353
-
1354
- if ( ca->elements == 0 ) {
1355
- out = CA_UNDEF;
1356
- }
1357
- else {
1358
- ca_attach(ca);
1359
- m = ( ca->mask ) ? (boolean8_t *)ca->mask->ptr : NULL;
1360
- mc = ( ( ! ca_has_mask(ca) ) || NIL_P(rmc)) ? ca->elements - 1 : NUM2SIZE(rmc);
1361
- if ( mc < 0 ) {
1362
- mc += ca->elements;
1363
- }
1364
- it.step = 0;
1365
- ca_proc[ca->data_type](ca->elements, mc, m, ca->ptr, &it, 1, &out, NULL, NULL);
1366
- ca_detach(ca);
1367
- }
1368
-
1369
- if ( out == CA_UNDEF && ( vfval != CA_NIL ) ) {
1370
- out = vfval;
1371
- }
1372
-
1373
- return out;
1374
- }
1375
-
1376
- static void
1377
- ca_stat_nd_contig_loop (CArray *ca, CArray *co, ca_size_t mc,
1378
- ca_stat_proc_t *ca_proc,
1379
- int level, ca_size_t *idx, char **op, boolean8_t **om)
1380
- {
1381
- void *p;
1382
- boolean8_t *m;
1383
- ca_size_t i, n;
1384
- if ( level == co->ndim ) {
1385
- CAStatIterator it;
1386
- n = ca->elements/co->elements;
1387
- idx[level] = 0;
1388
- p = ca_ptr_at_index(ca, idx);
1389
- m = ( ca->mask && ca->mask->ptr ) ?
1390
- (boolean8_t *)ca_ptr_at_index(ca->mask, idx) : NULL;
1391
- it.step = 0;
1392
- ca_proc[ca->data_type](n, mc, m, p, &it, 0, NULL, *om, *op);
1393
- if ( *om ) {
1394
- *om += 1;
1395
- }
1396
- *op += co->bytes;
1397
- }
1398
- else {
1399
- for (i=0; i<ca->dim[level]; i++) {
1400
- idx[level] = i;
1401
- ca_stat_nd_contig_loop(ca, co, mc, ca_proc, level+1, idx, op, om);
1402
- }
1403
- }
1404
- }
1405
-
1406
- static VALUE
1407
- rb_ca_stat_nd_contig (VALUE self, VALUE vaxis, VALUE rmc, VALUE vfval,
1408
- int8_t data_type, ca_stat_proc_t *ca_proc)
1409
- {
1410
- volatile VALUE out;
1411
- CArray *ca, *co;
1412
- ca_size_t mc, ndim;
1413
-
1414
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1415
-
1416
- if ( ! ca_proc[ca->data_type] ) {
1417
- rb_raise(rb_eCADataTypeError,
1418
- "this method is not implemented for data_type %s",
1419
- ca_type_name[ca->data_type]);
1420
- }
1421
-
1422
- ndim = ca->ndim - RARRAY_LEN(vaxis);
1423
- if ( ndim <= 0 || ndim > ca->ndim ) {
1424
- rb_raise(rb_eRuntimeError, "invalid dimension specified");
1425
- }
1426
-
1427
- out = rb_carray_new(data_type, ndim, ca->dim, 0, NULL);
1428
- TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1429
-
1430
- if ( ca_has_mask(ca) ) {
1431
- ca_create_mask(co);
1432
- }
1433
-
1434
- if ( NIL_P(rmc) ) {
1435
- mc = ca->elements/co->elements - 1;
1436
- }
1437
- else {
1438
- mc = NUM2SIZE(rmc);
1439
- }
1440
-
1441
- if ( mc < 0 ) {
1442
- mc += ca->elements;
1443
- }
1444
-
1445
- {
1446
- ca_size_t idx[CA_RANK_MAX];
1447
- char *op;
1448
- boolean8_t *om;
1449
- int8_t i;
1450
- for (i=0; i<ca->ndim; i++) {
1451
- idx[i] = 0;
1452
- }
1453
- ca_attach_n(2, ca, co);
1454
- op = co->ptr;
1455
- om = ( co->mask && co->mask->ptr ) ? (boolean8_t *)co->mask->ptr : NULL;
1456
- ca_stat_nd_contig_loop(ca, co, mc, ca_proc, 0, idx, &op, &om);
1457
- ca_sync(co);
1458
- ca_detach_n(2, ca, co);
1459
- }
1460
-
1461
- if ( ca_has_mask(co) && ( vfval != CA_NIL ) ) {
1462
- out = rb_ca_mask_fill_copy(out, vfval);
1463
- }
1464
-
1465
- return out;
1466
- }
1467
-
1468
- static void
1469
- ca_stat_get_offset_loop (CArray *ca, ca_size_t *dm,
1470
- int level, ca_size_t *idx,
1471
- int level1, ca_size_t *idx1,
1472
- CArray *offset)
1473
- {
1474
- ca_size_t i;
1475
- if ( level == ca->ndim - 1 ) {
1476
- if ( dm[level] == 0 ) {
1477
- idx[level] = 0;
1478
- *(ca_size_t *)ca_ptr_at_index(offset, idx1) = ca_index2addr(ca, idx);
1479
- }
1480
- else {
1481
- for (i=0; i<ca->dim[level]; i++) {
1482
- idx[level] = i;
1483
- idx1[level1] = i;
1484
- *(ca_size_t *)ca_ptr_at_index(offset, idx1) = ca_index2addr(ca, idx);
1485
- }
1486
- }
1487
- }
1488
- else {
1489
- if ( dm[level] == 0 ) {
1490
- idx[level] = 0;
1491
- ca_stat_get_offset_loop(ca, dm, level+1, idx, level1, idx1, offset);
1492
- }
1493
- else {
1494
- for (i=0; i<ca->dim[level]; i++) {
1495
- idx[level] = i;
1496
- idx1[level1] = i;
1497
- ca_stat_get_offset_loop(ca, dm, level+1, idx, level1+1, idx1, offset);
1498
- }
1499
- }
1500
- }
1501
- }
1502
-
1503
- static VALUE
1504
- rb_ca_stat_nd_discrete (VALUE self, VALUE vaxis, VALUE rmc, VALUE vfval,
1505
- int8_t data_type, ca_stat_proc_t *ca_proc)
1506
- {
1507
- volatile VALUE out;
1508
- ca_size_t idx[CA_RANK_MAX];
1509
- ca_size_t idx1[CA_RANK_MAX];
1510
- ca_size_t out_dim[CA_RANK_MAX];
1511
- ca_size_t loop_dim[CA_RANK_MAX];
1512
- ca_size_t dm[CA_RANK_MAX], dn[CA_RANK_MAX];
1513
- CArray *ca, *co, *first, *offset;
1514
- ca_size_t out_ndim, loop_ndim;
1515
- ca_size_t mc;
1516
- ca_size_t i, k;
1517
-
1518
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1519
-
1520
- for (i=0; i<ca->ndim; i++) {
1521
- dm[i] = 0;
1522
- dn[i] = 1;
1523
- }
1524
-
1525
- for (i=0; i<RARRAY_LEN(vaxis); i++) {
1526
- k = NUM2SIZE(rb_ary_entry(vaxis, i));
1527
- dm[k] = 1;
1528
- dn[k] = 0;
1529
- }
1530
-
1531
- out_ndim = 0;
1532
- loop_ndim = 0;
1533
- for (i=0; i<ca->ndim; i++) {
1534
- if ( dm[i] ) {
1535
- loop_dim[loop_ndim] = ca->dim[i];
1536
- loop_ndim += 1;
1537
- }
1538
- else {
1539
- out_dim[out_ndim] = ca->dim[i];
1540
- out_ndim += 1;
1541
- }
1542
- }
1543
-
1544
- out = rb_carray_new(data_type, out_ndim, out_dim, 0, NULL);
1545
- TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1546
-
1547
- first = carray_new(CA_SIZE, out_ndim, out_dim, 0, NULL);
1548
- first->ptr = realloc(first->ptr, first->bytes*(first->elements+1));
1549
-
1550
- offset = carray_new(CA_SIZE, loop_ndim, loop_dim, 0, NULL);
1551
- offset->ptr = realloc(offset->ptr, offset->bytes*(offset->elements+1));
1552
-
1553
- ca_stat_get_offset_loop(ca, dn, 0, idx, 0, idx1, first);
1554
- ca_stat_get_offset_loop(ca, dm, 0, idx, 0, idx1, offset);
1555
-
1556
- if ( ca_has_mask(ca) ) {
1557
- ca_create_mask(co);
1558
- }
1559
-
1560
- if ( NIL_P(rmc) ) {
1561
- mc = offset->elements - 1;
1562
- }
1563
- else {
1564
- mc = NUM2SIZE(rmc);
1565
- }
1566
-
1567
- if ( mc < 0 ) {
1568
- mc += offset->elements;
1569
- }
1570
-
1571
- ca_attach_n(2, ca, co);
1572
-
1573
- {
1574
- CAStatIterator it, jt;
1575
- ca_size_t *a = (ca_size_t *) (&it);
1576
- boolean8_t *m0, *m, *om;
1577
- char *p, *op;
1578
-
1579
- it.step = 1;
1580
- it.addr = (ca_size_t *)first->ptr;
1581
- jt.step = 1;
1582
- jt.addr = (ca_size_t *)offset->ptr;
1583
-
1584
- m0 = ( ca->mask && ca->mask->ptr ) ? (boolean8_t *)ca->mask->ptr : NULL;
1585
- om = ( co->mask && co->mask->ptr ) ? (boolean8_t *)co->mask->ptr : NULL;
1586
- op = co->ptr;
1587
-
1588
- iterator_rewind(&it);
1589
- for (i=0; i<co->elements; i++) {
1590
- m = ( m0 ) ? m0 + (*a) : NULL;
1591
- p = ca->ptr + (*a) * ca->bytes;
1592
- ca_proc[ca->data_type](offset->elements, mc, m, p, &jt, 0, NULL, om, op);
1593
- if ( om ) {
1594
- om += 1;
1595
- }
1596
- op += co->bytes;
1597
- iterator_succ(&it);
1598
- }
1599
- }
1600
-
1601
- ca_sync(co);
1602
- ca_detach_n(2, ca, co);
1603
-
1604
- if ( ca_has_mask(co) && ( vfval != CA_NIL ) ) {
1605
- out = rb_ca_mask_fill_copy(out, vfval);
1606
- }
1607
-
1608
- ca_free(first);
1609
- ca_free(offset);
1610
-
1611
- return out;
1612
- }
1613
-
1614
- static VALUE
1615
- rb_ca_stat_general (int argc, VALUE *argv, VALUE self,
1616
- int8_t data_type, ca_stat_proc_t *ca_proc)
1617
- {
1618
- volatile VALUE ropt, rmc = Qnil, rmask_limit = Qnil, rmin_count = Qnil,
1619
- vfval = CA_NIL, vaxis;
1620
- CArray *ca;
1621
-
1622
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1623
-
1624
- ropt = rb_pop_options(&argc, &argv);
1625
- rb_scan_options(ropt,
1626
- "mask_limit,fill_value,min_count",
1627
- &rmask_limit, &vfval, &rmin_count);
1628
-
1629
- if ( ( ! NIL_P(rmask_limit) ) && ( ! NIL_P(rmin_count) ) ) {
1630
- rb_raise(rb_eArgError,
1631
- "don't specify mask_limit and min_count simaltaniously");
1632
- }
1633
- else if ( ! NIL_P(rmin_count) ) {
1634
- ca_size_t min_count = NUM2SIZE(rmin_count);
1635
- if ( min_count == 0 ) {
1636
- rmc = Qnil;
1637
- }
1638
- else {
1639
- rmc = SIZE2NUM(-min_count);
1640
- }
1641
- }
1642
- else if ( ! NIL_P(rmask_limit) ) {
1643
- ca_size_t mask_limit = NUM2SIZE(rmask_limit);
1644
- if ( mask_limit == 0 ) {
1645
- rmc = Qnil;
1646
- }
1647
- else {
1648
- rmc = SIZE2NUM(mask_limit-1);
1649
- }
1650
- }
1651
- else {
1652
- rmc = Qnil;
1653
- }
1654
-
1655
- if ( argc > 0 ) {
1656
- vaxis = rb_ary_new4(argc, argv);
1657
- }
1658
- else {
1659
- vaxis = Qnil;
1660
- }
1661
-
1662
- if ( NIL_P(vaxis) ) {
1663
- return rb_ca_stat_1d(self, rmc, vfval, ca_proc);
1664
- }
1665
- else {
1666
- int is_contig = 1;
1667
- ca_size_t i, k;
1668
-
1669
- vaxis = rb_funcall(vaxis, rb_intern("sort"), 0);
1670
- vaxis = rb_funcall(vaxis, rb_intern("uniq"), 0);
1671
-
1672
- for (i=0; i<RARRAY_LEN(vaxis); i++) {
1673
- k = NUM2SIZE(rb_ary_entry(vaxis, RARRAY_LEN(vaxis)-1-i));
1674
- CA_CHECK_INDEX(k, ca->ndim);
1675
- if ( k != ca->ndim-1-i ) {
1676
- is_contig = 0;
1677
- }
1678
- }
1679
-
1680
- if ( is_contig ) {
1681
- if ( RARRAY_LEN(vaxis) == ca->ndim ) {
1682
- return rb_ca_stat_1d(self, rmc, vfval, ca_proc);
1683
- }
1684
- else {
1685
- return rb_ca_stat_nd_contig(self, vaxis, rmc, vfval,
1686
- data_type, ca_proc);
1687
- }
1688
- }
1689
- else {
1690
- return rb_ca_stat_nd_discrete(self, vaxis, rmc, vfval,
1691
- data_type, ca_proc);
1692
- }
1693
- }
1694
- }
1695
-
1696
-
1697
- static VALUE
1698
- rb_ca_prod (int argc, VALUE *argv, VALUE self)
1699
- {
1700
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_prod);
1701
- }
1702
-
1703
- static VALUE
1704
- rb_ca_count (int argc, VALUE *argv, VALUE self)
1705
- {
1706
- return rb_ca_stat_general(argc, argv, self, CA_INT32, ca_proc_count);
1707
- }
1708
-
1709
- static VALUE
1710
- rb_ca_sum (int argc, VALUE *argv, VALUE self)
1711
- {
1712
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_sum);
1713
- }
1714
-
1715
- static VALUE
1716
- rb_ca_mean (int argc, VALUE *argv, VALUE self)
1717
- {
1718
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_mean);
1719
- }
1720
-
1721
- static VALUE
1722
- rb_ca_variancep (int argc, VALUE *argv, VALUE self)
1723
- {
1724
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_variancep);
1725
- }
1726
-
1727
- static VALUE
1728
- rb_ca_stddevp (int argc, VALUE *argv, VALUE self)
1729
- {
1730
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_stddevp);
1731
- }
1732
-
1733
- static VALUE
1734
- rb_ca_variance (int argc, VALUE *argv, VALUE self)
1735
- {
1736
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_variance);
1737
- }
1738
-
1739
- static VALUE
1740
- rb_ca_stddev (int argc, VALUE *argv, VALUE self)
1741
- {
1742
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_stddev);
1743
- }
1744
-
1745
- static VALUE
1746
- rb_ca_min (int argc, VALUE *argv, VALUE self)
1747
- {
1748
- CArray *ca;
1749
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1750
- return rb_ca_stat_general(argc, argv, self, ca->data_type, ca_proc_min);
1751
- }
1752
-
1753
- static VALUE
1754
- rb_ca_min_addr (int argc, VALUE *argv, VALUE self)
1755
- {
1756
- return rb_ca_stat_general(argc, argv, self, CA_INT32, ca_proc_min_addr);
1757
- }
1758
-
1759
- static VALUE
1760
- rb_ca_max (int argc, VALUE *argv, VALUE self)
1761
- {
1762
- CArray *ca;
1763
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1764
- return rb_ca_stat_general(argc, argv, self, ca->data_type, ca_proc_max);
1765
- }
1766
-
1767
- static VALUE
1768
- rb_ca_max_addr (int argc, VALUE *argv, VALUE self)
1769
- {
1770
- return rb_ca_stat_general(argc, argv, self, CA_INT32, ca_proc_max_addr);
1771
- }
1772
-
1773
- static VALUE
1774
- rb_ca_accum (int argc, VALUE *argv, VALUE self)
1775
- {
1776
- CArray *ca;
1777
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1778
- return rb_ca_stat_general(argc, argv, self, ca->data_type, ca_proc_accum);
1779
- }
1780
-
1781
- static VALUE
1782
- rb_ca_stat_type2 (int argc, VALUE *argv, VALUE self,
1783
- int8_t data_type, ca_stat_proc_t *ca_proc)
1784
- {
1785
- volatile VALUE out, rmc, rfval;
1786
- CArray *ca, *co;
1787
- ca_size_t mc;
1788
-
1789
- rb_scan_args(argc, argv, "02", (VALUE *) &rmc, (VALUE *) &rfval);
1790
-
1791
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1792
-
1793
- if ( ! ca_proc[ca->data_type] ) {
1794
- rb_raise(rb_eCADataTypeError,
1795
- "this method is not implemented for data_type %s",
1796
- ca_type_name[ca->data_type]);
1797
- }
1798
-
1799
- out = rb_carray_new(data_type, 1, &ca->elements, 0, NULL);
1800
- TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1801
-
1802
- if ( ca->elements == 0 ) {
1803
- ;
1804
- }
1805
- else {
1806
- CAStatIterator it;
1807
- boolean8_t *m = NULL;
1808
- boolean8_t *om = NULL;
1809
- ca_attach(ca);
1810
- if ( ca->mask ) {
1811
- m = (boolean8_t *)ca->mask->ptr;
1812
- }
1813
- mc = ( (! ca->mask) || NIL_P(rmc) ) ? ca->elements - 1 : NUM2SIZE(rmc);
1814
- if ( mc < 0 ) {
1815
- mc += ca->elements;
1816
- }
1817
- if ( m ) {
1818
- ca_create_mask(co);
1819
- om = (boolean8_t *) co->mask->ptr;
1820
- }
1821
- it.step = 0;
1822
- ca_proc[ca->data_type](ca->elements, mc, m, ca->ptr, &it,
1823
- om, co->ptr);
1824
- ca_detach(ca);
1825
- }
1826
-
1827
- if ( ca_has_mask(co) && ( ! NIL_P(rfval) ) ) {
1828
- out = rb_ca_mask_fill_copy(out, rfval);
1829
- }
1830
-
1831
- return out;
1832
- }
1833
-
1834
- static void
1835
- ca_dimstat_type2_loop (CArray *ca, CArray *co, ca_size_t mc,
1836
- ca_stat_proc_t *ca_proc,
1837
- int level, ca_size_t *idx, char **op, boolean8_t **om)
1838
- {
1839
- void *p;
1840
- boolean8_t *m;
1841
- ca_size_t i, n;
1842
- if ( level == co->ndim ) {
1843
- CAStatIterator it;
1844
- n = ca->elements/co->elements;
1845
- idx[level] = 0;
1846
- p = ca_ptr_at_index(ca, idx);
1847
- m = ( ca->mask && ca->mask->ptr ) ?
1848
- (boolean8_t *)ca_ptr_at_index(ca->mask, idx) : NULL;
1849
- it.step = 0;
1850
- ca_proc[ca->data_type](n, mc, m, p, &it, 0, NULL, *om, *op);
1851
- printf("world\n");
1852
- if ( *om ) {
1853
- *om += n;
1854
- }
1855
- *op += n*co->bytes;
1856
- }
1857
- else {
1858
- for (i=0; i<ca->dim[level]; i++) {
1859
- idx[level] = i;
1860
- ca_dimstat_type2_loop(ca, co, mc, ca_proc, level+1, idx, op, om);
1861
- }
1862
- }
1863
- }
1864
-
1865
- static void
1866
- ca_dimstat_type2 (CArray *ca, CArray *co, ca_size_t mc, ca_stat_proc_t *ca_proc)
1867
- {
1868
- ca_size_t idx[CA_RANK_MAX];
1869
- char *op;
1870
- boolean8_t *om;
1871
- int8_t i;
1872
- for (i=0; i<ca->ndim; i++) {
1873
- idx[i] = 0;
1874
- }
1875
- ca_attach_n(2, ca, co);
1876
- op = co->ptr;
1877
- om = ( co->mask && co->mask->ptr ) ? (boolean8_t *)co->mask->ptr : NULL;
1878
- ca_dimstat_type2_loop(ca, co, mc, ca_proc, 0, idx, &op, &om);
1879
- ca_sync(co);
1880
- ca_detach_n(2, ca, co);
1881
- }
1882
-
1883
- static VALUE
1884
- rb_ca_dimstat_type2 (int argc, VALUE *argv, VALUE self,
1885
- int8_t data_type, ca_stat_proc_t *ca_proc)
1886
- {
1887
- volatile VALUE rndim, rmc, rfval;
1888
- volatile VALUE out;
1889
- CArray *ca, *co;
1890
- ca_size_t odim[CA_RANK_MAX], n;
1891
- ca_size_t mc, ndim;
1892
- int32_t i;
1893
-
1894
- rb_scan_args(argc, argv, "12", (VALUE *) &rndim, (VALUE *) &rmc, (VALUE *) &rfval);
1895
-
1896
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1897
-
1898
- if ( ! ca_proc[ca->data_type] ) {
1899
- rb_raise(rb_eCADataTypeError,
1900
- "this method is not implemented for data_type %s",
1901
- ca_type_name[ca->data_type]);
1902
- }
1903
-
1904
- ndim = NUM2SIZE(rndim);
1905
- if ( ndim <= 0 || ndim > ca->ndim ) {
1906
- rb_raise(rb_eRuntimeError, "invalid dimension specified");
1907
- }
1908
-
1909
- n = 1;
1910
- for (i=0; i<ndim; i++) {
1911
- odim[i] = ca->dim[i];
1912
- n *= odim[i];
1913
- }
1914
- odim[ndim] = ca->elements/n;
1915
-
1916
- out = rb_carray_new(data_type, ndim+1, odim, 0, NULL);
1917
- TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1918
-
1919
- if ( ca_has_mask(ca) ) {
1920
- ca_create_mask(co);
1921
- }
1922
-
1923
- if ( NIL_P(rmc) ) {
1924
- mc = ca->elements/co->elements - 1;
1925
- }
1926
- else {
1927
- mc = NUM2SIZE(rmc);
1928
- }
1929
-
1930
- if ( mc < 0 ) {
1931
- mc += ca->elements;
1932
- }
1933
-
1934
- ca_dimstat_type2(ca, co, mc, ca_proc);
1935
-
1936
- if ( ca_has_mask(co) && ( ! NIL_P(rfval) ) ) {
1937
- out = rb_ca_mask_fill_copy(out, rfval);
1938
- }
1939
-
1940
- return out;
1941
- }
1942
-
1943
- static VALUE
1944
- rb_ca_cumcount (int argc, VALUE *argv, VALUE self)
1945
- {
1946
- return rb_ca_stat_type2(argc, argv, self, CA_INT32, ca_proc_cumcount);
1947
- }
1948
-
1949
- static VALUE
1950
- rb_ca_dimcumcount (int argc, VALUE *argv, VALUE self)
1951
- {
1952
- return rb_ca_dimstat_type2(argc, argv, self, CA_INT32, ca_proc_cumcount);
1953
- }
1954
-
1955
- static VALUE
1956
- rb_ca_cumsum (int argc, VALUE *argv, VALUE self)
1957
- {
1958
- return rb_ca_stat_type2(argc, argv, self, CA_FLOAT64, ca_proc_cumsum);
1959
- }
1960
-
1961
- static VALUE
1962
- rb_ca_dimcumsum (int argc, VALUE *argv, VALUE self)
1963
- {
1964
- return rb_ca_dimstat_type2(argc, argv, self, CA_FLOAT64, ca_proc_cumsum);
1965
- }
1966
-
1967
- void
1968
- Init_carray_stat_proc ()
1969
- {
1970
- id_lt = rb_intern("<");
1971
- id_gt = rb_intern(">");
1972
- id_plus = rb_intern("+");
1973
- id_minus = rb_intern("-");
1974
- id_star = rb_intern("*");
1975
- id_quo = rb_intern("quo");
1976
-
1977
- rb_define_method(rb_cCArray, "prod", rb_ca_prod, -1);
1978
- rb_define_method(rb_cCArray, "count_valid", rb_ca_count, -1);
1979
- rb_define_method(rb_cCArray, "sum", rb_ca_sum, -1);
1980
- rb_define_method(rb_cCArray, "mean", rb_ca_mean, -1);
1981
- rb_define_method(rb_cCArray, "variancep", rb_ca_variancep, -1);
1982
- rb_define_method(rb_cCArray, "stddevp", rb_ca_stddevp, -1);
1983
- rb_define_method(rb_cCArray, "variance", rb_ca_variance, -1);
1984
- rb_define_method(rb_cCArray, "stddev", rb_ca_stddev, -1);
1985
- rb_define_method(rb_cCArray, "min", rb_ca_min, -1);
1986
- rb_define_method(rb_cCArray, "max", rb_ca_max, -1);
1987
- rb_define_method(rb_cCArray, "min_addr", rb_ca_min_addr, -1);
1988
- rb_define_method(rb_cCArray, "max_addr", rb_ca_max_addr, -1);
1989
-
1990
- rb_define_method(rb_cCArray, "accumulate", rb_ca_accum, -1);
1991
-
1992
- rb_define_method(rb_cCArray, "cumcount", rb_ca_cumcount, -1);
1993
- rb_define_method(rb_cCArray, "dimcumcount", rb_ca_dimcumcount, -1);
1994
- rb_define_method(rb_cCArray, "cumsum", rb_ca_cumsum, -1);
1995
- rb_define_method(rb_cCArray, "dimcumsum", rb_ca_dimcumsum, -1);
1996
- }
1997
-
1998
-
1999
-