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
data/ext/mkmath.rb DELETED
@@ -1,741 +0,0 @@
1
- # ----------------------------------------------------------------------------
2
- #
3
- # mkmath.rb
4
- #
5
- # This file is part of Ruby/CArray extension library.
6
- # You can redistribute it and/or modify it under the terms of
7
- # the Ruby Licence.
8
- #
9
- # Copyright (C) 2005 Hiroki Motoyoshi
10
- #
11
- # ----------------------------------------------------------------------------
12
-
13
- require 'stringio'
14
-
15
- def monfunc (op, name, hash)
16
- io = StringIO.new
17
- io.puts
18
- io.puts "/*----------------------- #{name} --------------------------*/"
19
- hash.each do |types, expr0|
20
- if not expr0
21
- next
22
- end
23
- expr0.gsub!(/#/, '*p')
24
- types.each do |type|
25
- if type
26
- expr = expr0.gsub(/<type>/, type)
27
- omp_ok = ( type != "VALUE" ) ? 1 : 0
28
- io.print %{
29
- static void
30
- ca_monop_#{name}_#{type} (ca_size_t n, boolean8_t *m, char *ptr1, ca_size_t i1, char *ptr2, ca_size_t i2)
31
- {
32
- #{type} *q1 = (#{type} *) ptr1, *q2 = (#{type} *) ptr2;
33
- #{type} *p1 = q1, *p2 = q2;
34
- ca_size_t k;
35
- if ( m ) {
36
- boolean8_t *pm;
37
- #if defined(_OPENMP) && #{omp_ok}
38
- #pragma omp parallel for private(pm,p1,p2)
39
- #endif
40
- for (k=0; k<n; k++) {
41
- pm = m + k;
42
- if ( ! *pm ) {
43
- p1 = q1 + k*i1;
44
- p2 = q2 + k*i2;
45
- {
46
- #{expr}
47
- }
48
- }
49
- }
50
- }
51
- else {
52
- #if defined(_OPENMP) && #{omp_ok}
53
- #pragma omp parallel for private(p1,p2)
54
- #endif
55
- for (k=0; k<n; k++) {
56
- p1 = q1 + k*i1;
57
- p2 = q2 + k*i2;
58
- {
59
- #{expr}
60
- }
61
- }
62
- }
63
- }
64
- }
65
- end
66
- end
67
- end
68
- io.puts
69
- io.puts "ca_monop_func_t"
70
- io.puts "ca_monop_#{name}[CA_NTYPE] = {"
71
- ALL_TYPES.each_index do |i|
72
- type = nil
73
- hash.each do |types, expr|
74
- if not expr
75
- next
76
- end
77
- type ||= types[i]
78
- end
79
- if type
80
- io.puts(" ca_monop_#{name}_#{type},")
81
- else
82
- io.puts(" ca_monop_not_implement,")
83
- end
84
- end
85
- io.puts "};"
86
- io.puts
87
- if hash.has_key?(INT_TYPES) or hash.has_key?(ALL_TYPES)
88
- io.print %{
89
- static VALUE rb_ca_#{name} (VALUE self)
90
- { return rb_ca_call_monop(self, ca_monop_#{name}); }
91
- }
92
- else
93
- io.print %{
94
- static VALUE rb_ca_#{name} (VALUE self)
95
- {
96
- if ( rb_ca_is_integer_type(self) ) {
97
- self = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
98
- }
99
- return rb_ca_call_monop(self, ca_monop_#{name});
100
- }
101
- }
102
- end
103
- io.print %{
104
- static VALUE rb_ca_#{name}_bang (VALUE self)
105
- { return rb_ca_call_monop_bang(self, ca_monop_#{name}); }
106
- }
107
- DEFINITIONS << io.string
108
- if op
109
- METHODS << %{
110
- rb_define_method(rb_cCArray, "#{op}", rb_ca_#{name}, 0);
111
- }
112
- end
113
- METHODS << %{
114
- rb_define_method(rb_cCArray, "#{name}!", rb_ca_#{name}_bang, 0);
115
- }
116
- DEFINITIONS << %{
117
- static VALUE rb_cmath_#{name} (VALUE mod, VALUE arg)
118
- { return ca_math_call(mod, arg, rb_intern("#{name}")); }
119
- }
120
- METHODS << %{
121
- rb_define_module_function(rb_mCAMath, "#{name}", rb_cmath_#{name}, 1);
122
- }
123
- end
124
-
125
-
126
- def monop (op, name, hash)
127
- io = StringIO.new
128
- io.puts
129
- io.puts "/*----------------------- #{name} --------------------------*/"
130
- hash.each do |types, expr0|
131
- if not expr0
132
- next
133
- end
134
- expr0.gsub!(/#/, '*p')
135
- types.each do |type|
136
- if type
137
- expr = expr0.gsub(/<type>/, type)
138
- omp_ok = ( type != "VALUE" ) ? 1 : 0
139
- io.print %{
140
- static void
141
- ca_monop_#{name}_#{type} (ca_size_t n, boolean8_t *m, char *ptr1, ca_size_t i1, char *ptr2, ca_size_t i2)
142
- {
143
- #{type} *q1 = (#{type} *) ptr1, *q2 = (#{type} *) ptr2;
144
- #{type} *p1 = q1, *p2 = q2;
145
- ca_size_t k;
146
- if ( m ) {
147
- boolean8_t *pm;
148
- #if defined(_OPENMP) && #{omp_ok}
149
- #pragma omp parallel for private(pm,p1,p2)
150
- #endif
151
- for (k=0; k<n; k++) {
152
- pm = m + k;
153
- if ( ! *pm ) {
154
- p1 = q1 + k*i1;
155
- p2 = q2 + k*i2;
156
- {
157
- #{expr}
158
- }
159
- }
160
- }
161
- }
162
- else {
163
- #if defined(_OPENMP) && #{omp_ok}
164
- #pragma omp parallel for private(p1,p2)
165
- #endif
166
- for (k=0; k<n; k++) {
167
- p1 = q1 + k*i1;
168
- p2 = q2 + k*i2;
169
- {
170
- #{expr}
171
- }
172
- }
173
- }
174
- }
175
- }
176
- end
177
- end
178
- end
179
- io.puts
180
- io.puts "ca_monop_func_t"
181
- io.puts "ca_monop_#{name}[CA_NTYPE] = {"
182
- ALL_TYPES.each_index do |i|
183
- type = nil
184
- hash.each do |types, expr|
185
- if not expr
186
- next
187
- end
188
- type ||= types[i]
189
- end
190
- if type
191
- io.puts(" ca_monop_#{name}_#{type},")
192
- else
193
- io.puts(" ca_monop_not_implement,")
194
- end
195
- end
196
- io.puts "};"
197
- io.puts
198
- io.print %{
199
- static VALUE rb_ca_#{name} (VALUE self)
200
- { return rb_ca_call_monop(self, ca_monop_#{name}); }
201
- static VALUE rb_ca_#{name}_bang (VALUE self)
202
- { return rb_ca_call_monop_bang(self, ca_monop_#{name}); }
203
- }
204
- DEFINITIONS << io.string
205
- if op
206
- METHODS << %{
207
- rb_define_method(rb_cCArray, "#{op}", rb_ca_#{name}, 0);
208
- }
209
- end
210
- METHODS << %{
211
- rb_define_method(rb_cCArray, "#{name}!", rb_ca_#{name}_bang, 0);
212
- }
213
-
214
- end
215
-
216
- def binop (op, name, hash)
217
- io = StringIO.new
218
- io.puts
219
- io.puts "/*----------------------- #{name} --------------------------*/"
220
- hash.each do |types, expr0|
221
- if not expr0
222
- next
223
- end
224
- expr0.gsub!(/#/, '*p')
225
- types.each do |type|
226
- if type
227
- expr = expr0.gsub(/<type>/, type)
228
- omp_ok = ( type != "VALUE" ) ? 1 : 0
229
- io.print %{
230
- static void
231
- ca_binop_#{name}_#{type} (ca_size_t n, boolean8_t *m, char *ptr1, ca_size_t i1, char *ptr2, ca_size_t i2, char *ptr3, ca_size_t i3)
232
- {
233
- #{type} *q1 = (#{type} *) ptr1, *q2 = (#{type} *) ptr2, *q3 = (#{type} *) ptr3;
234
- #{type} *p1 = q1, *p2 = q2, *p3 = q3;
235
- ca_size_t k;
236
- if ( m ) {
237
- boolean8_t *pm;
238
- #if defined(_OPENMP) && #{omp_ok}
239
- #pragma omp parallel for private(pm,p1,p2,p3)
240
- #endif
241
- for (k=0; k<n; k++) {
242
- pm = m + k;
243
- if ( ! *pm ) {
244
- p1 = q1 + k*i1;
245
- p2 = q2 + k*i2;
246
- p3 = q3 + k*i3;
247
- {
248
- #{expr}
249
- }
250
- }
251
- }
252
- }
253
- else {
254
- #if defined(_OPENMP) && #{omp_ok}
255
- #pragma omp parallel for private(p1,p2,p3)
256
- #endif
257
- for (k=0; k<n; k++) {
258
- p1 = q1 + k*i1;
259
- p2 = q2 + k*i2;
260
- p3 = q3 + k*i3;
261
- {
262
- #{expr}
263
- }
264
- }
265
- }
266
- }
267
- }
268
- end
269
- end
270
- end
271
- io.puts
272
- io.puts "ca_binop_func_t"
273
- io.puts "ca_binop_#{name}[CA_NTYPE] = {"
274
- ALL_TYPES.each_index do |i|
275
- type = nil
276
- hash.each do |types, expr|
277
- if not expr
278
- next
279
- end
280
- type ||= types[i]
281
- end
282
- if type
283
- io.puts(" ca_binop_#{name}_#{type},")
284
- else
285
- io.puts(" ca_binop_not_implement,")
286
- end
287
- end
288
- io.puts "};"
289
- io.puts
290
- io.print %{
291
- static VALUE rb_ca_#{name} (VALUE self, VALUE other)
292
- {
293
- if ( ! rb_ca_test_castable(other) ) {
294
- return rb_ca_binop_pass_to_other(self, other, rb_intern("#{op}"));
295
- }
296
- return rb_ca_call_binop(self, other, ca_binop_#{name});
297
- }
298
- static VALUE rb_ca_#{name}_bang (VALUE self, VALUE other)
299
- { return rb_ca_call_binop_bang(self, other, ca_binop_#{name}); }
300
- }
301
- DEFINITIONS << io.string
302
- if op
303
- METHODS << %{
304
- rb_define_method(rb_cCArray, "#{op}", rb_ca_#{name}, 1);
305
- }
306
- end
307
- METHODS << %{
308
- rb_define_method(rb_cCArray, "#{name}!", rb_ca_#{name}_bang, 1);
309
- }
310
-
311
- end
312
-
313
- def moncmp (op, name, hash)
314
- io = StringIO.new
315
- io.puts
316
- io.puts "/*----------------------- #{name} --------------------------*/"
317
- hash.each do |types, expr0|
318
- if not expr0
319
- next
320
- end
321
- expr0.gsub!(/#/, '*p')
322
- types.each do |type|
323
- if type
324
- expr = expr0.gsub(/<type>/, type)
325
- omp_ok = ( type != "VALUE" ) ? 1 : 0
326
- io.print %{
327
- static void
328
- ca_moncmp_#{name}_#{type} (ca_size_t n, boolean8_t *m, char *ptr1, ca_size_t i1, boolean8_t *ptr2, ca_size_t i2)
329
- {
330
- #{type} *q1 = (#{type} *) ptr1;
331
- #{type} *p1 = q1;
332
- boolean8_t *q2 = (boolean8_t *) ptr2;
333
- boolean8_t *p2 = q2;
334
- ca_size_t k;
335
- if ( m ) {
336
- boolean8_t *pm = m;
337
- #if defined(_OPENMP) && #{omp_ok}
338
- #pragma omp parallel for private(pm,p1,p2)
339
- #endif
340
- for (k=0; k<n; k++) {
341
- pm = m + k;
342
- if ( ! *pm ) {
343
- p1 = q1 + k*i1;
344
- p2 = q2 + k*i2;
345
- {
346
- #{expr}
347
- }
348
- }
349
- }
350
- }
351
- else {
352
- #if defined(_OPENMP) && #{omp_ok}
353
- #pragma omp parallel for private(p1,p2)
354
- #endif
355
- for (k=0; k<n; k++) {
356
- p1=q1+k*i1;
357
- p2=q2+k*i2;
358
- {
359
- #{expr}
360
- }
361
- }
362
- }
363
- }
364
- }
365
- end
366
- end
367
- end
368
- io.puts
369
- io.puts "ca_moncmp_func_t"
370
- io.puts "ca_moncmp_#{name}[CA_NTYPE] = {"
371
- ALL_TYPES.each_index do |i|
372
- type = nil
373
- hash.each do |types, expr|
374
- if not expr
375
- next
376
- end
377
- type ||= types[i]
378
- end
379
- if type
380
- io.puts(" ca_moncmp_#{name}_#{type},")
381
- else
382
- io.puts(" ca_moncmp_not_implement,")
383
- end
384
- end
385
- io.puts "};"
386
- io.puts
387
- io.print %{
388
- static VALUE rb_ca_#{name} (VALUE self)
389
- { return rb_ca_call_moncmp(self, ca_moncmp_#{name}); }
390
- }
391
- DEFINITIONS << io.string
392
- if op
393
- METHODS << %{
394
- rb_define_method(rb_cCArray, "#{op}", rb_ca_#{name}, 0);
395
- }
396
- end
397
- end
398
-
399
- EPSILON = {
400
- "float32_t" => "FLT_EPSILON",
401
- "float64_t" => "DBL_EPSILON",
402
- "float128_t" => "DBL_EPSILON",
403
- }
404
-
405
- def bincmp (op, name, hash)
406
- io = StringIO.new
407
- io.puts
408
- io.puts "/*----------------------- #{name} --------------------------*/"
409
- hash.each do |types, expr0|
410
- if not expr0
411
- next
412
- end
413
- expr0.gsub!(/#(\d)/, '*p\1')
414
- types.each do |type|
415
- if type
416
- expr = expr0.clone
417
- expr.gsub!(/<type>/, type)
418
- expr.gsub!(/<epsilon>/, EPSILON[type]||"")
419
- if type != "fixlen"
420
- omp_ok = ( type != "VALUE" ) ? 1 : 0
421
- io.print %{
422
- static void
423
- ca_bincmp_#{name}_#{type} (ca_size_t n, boolean8_t *m,
424
- char *ptr1, ca_size_t b1, ca_size_t i1,
425
- char *ptr2, ca_size_t b2, ca_size_t i2,
426
- char *ptr3, ca_size_t b3, ca_size_t i3)
427
- {
428
- #{type} *q1 = (#{type} *) ptr1, *q2 = (#{type} *) ptr2;
429
- #{type} *p1 = q1, *p2 = q2;
430
- boolean8_t *q3 = (boolean8_t *) ptr3;
431
- boolean8_t *p3 = q3;
432
- ca_size_t k;
433
- if ( m ) {
434
- boolean8_t *pm = m;
435
- #if defined(_OPENMP) && #{omp_ok}
436
- #pragma omp parallel for private(pm,p1,p2,p3)
437
- #endif
438
- for (k=0; k<n; k++) {
439
- pm = m + k;
440
- if ( ! *pm ) {
441
- p1 = q1 + k*i1;
442
- p2 = q2 + k*i2;
443
- p3 = q3 + k*i3;
444
- {
445
- #{expr}
446
- }
447
- }
448
- }
449
- }
450
- else {
451
- #if defined(_OPENMP) && #{omp_ok}
452
- #pragma omp parallel for private(p1,p2,p3)
453
- #endif
454
- for (k=0; k<n; k++) {
455
- p1=q1+k*i1;
456
- p2=q2+k*i2;
457
- p3=q3+k*i3;
458
- {
459
- #{expr}
460
- }
461
- }
462
- }
463
- }
464
- }
465
- else ### fixlen
466
- omp_ok = 1
467
- io.print %{
468
- static void
469
- ca_bincmp_#{name}_#{type} (ca_size_t n, boolean8_t *m,
470
- char *ptr1, ca_size_t b1, ca_size_t i1,
471
- char *ptr2, ca_size_t b2, ca_size_t i2,
472
- char *ptr3, ca_size_t b3, ca_size_t i3)
473
- {
474
- char *q1 = ptr1, *q2 = ptr2;
475
- char *p1 = q1, *p2 = q2;
476
- boolean8_t *q3 = (boolean8_t *) ptr3;
477
- boolean8_t *p3 = q3;
478
- ca_size_t s1 = b1*i1, s2 = b2*i2, s3 = b3*i3;
479
- ca_size_t k;
480
- if ( m ) {
481
- boolean8_t *pm = m;
482
- #if defined(_OPENMP) && #{omp_ok}
483
- #pragma omp parallel for private(pm,p1,p2,p3)
484
- #endif
485
- for (k=0; k<n; k++) {
486
- pm = m + k;
487
- if ( ! *pm ) {
488
- p1 = q1 + k*s1;
489
- p2 = q2 + k*s2;
490
- p3 = q3 + k*s3;
491
- {
492
- #{expr}
493
- }
494
- }
495
- }
496
- }
497
- else {
498
- #if defined(_OPENMP) && #{omp_ok}
499
- #pragma omp parallel for private(p1,p2,p3)
500
- #endif
501
- for (k=0; k<n; k++) {
502
- p1=q1+k*s1;
503
- p2=q2+k*s2;
504
- p3=q3+k*s3;
505
- {
506
- #{expr}
507
- }
508
- }
509
- }
510
- }
511
- }
512
- end
513
- end
514
- end
515
- end
516
- io.puts
517
- io.puts "ca_bincmp_func_t"
518
- io.puts "ca_bincmp_#{name}[CA_NTYPE] = {"
519
- ALL_TYPES.each_index do |i|
520
- type = nil
521
- hash.each do |types, expr|
522
- if not expr
523
- next
524
- end
525
- type ||= types[i]
526
- end
527
- if type
528
- io.puts(" ca_bincmp_#{name}_#{type},")
529
- else
530
- io.puts(" ca_bincmp_not_implement,")
531
- end
532
- end
533
- io.puts "};"
534
- io.puts
535
- io.print %{
536
- static VALUE rb_ca_#{name} (VALUE self, VALUE other)
537
- {
538
- if ( ! rb_ca_test_castable(other) ) {
539
- return rb_ca_binop_pass_to_other(self, other, rb_intern("#{op}"));
540
- }
541
- return rb_ca_call_bincmp(self, other, ca_bincmp_#{name});
542
- }
543
- }
544
- DEFINITIONS << io.string
545
- if op
546
- METHODS << %{
547
- rb_define_method(rb_cCArray, "#{op}", rb_ca_#{name}, 1);
548
- }
549
- end
550
- end
551
-
552
- def alias_op (op, name)
553
- METHODS << %{
554
- rb_define_alias(rb_cCArray, "#{op}", "#{name}");
555
- }
556
- end
557
-
558
- ALL_TYPES = [
559
- nil,
560
- nil,
561
- "int8_t",
562
- "uint8_t",
563
- "int16_t",
564
- "uint16_t",
565
- "int32_t",
566
- "uint32_t",
567
- "int64_t",
568
- "uint64_t",
569
- "float32_t",
570
- "float64_t",
571
- "float128_t",
572
- nil,
573
- nil,
574
- nil,
575
- nil,
576
- ]
577
-
578
- BOOL_TYPES = [
579
- nil,
580
- "boolean8_t",
581
- nil, #"int8_t",
582
- nil, #"uint8_t",
583
- nil,
584
- nil,
585
- nil,
586
- nil,
587
- nil,
588
- nil,
589
- nil,
590
- nil,
591
- nil,
592
- nil,
593
- nil,
594
- nil,
595
- nil,
596
- ]
597
-
598
- INT_TYPES = [
599
- nil,
600
- nil,
601
- "int8_t",
602
- "uint8_t",
603
- "int16_t",
604
- "uint16_t",
605
- "int32_t",
606
- "uint32_t",
607
- "int64_t",
608
- "uint64_t",
609
- nil,
610
- nil,
611
- nil,
612
- nil,
613
- nil,
614
- nil,
615
- nil,
616
- ]
617
-
618
- FLOAT_TYPES = [
619
- nil,
620
- nil,
621
- nil,
622
- nil,
623
- nil,
624
- nil,
625
- nil,
626
- nil,
627
- nil,
628
- nil,
629
- "float32_t",
630
- "float64_t",
631
- "float128_t",
632
- nil,
633
- nil,
634
- nil,
635
- nil,
636
- ]
637
-
638
- CMPLX_TYPES = [
639
- nil,
640
- nil,
641
- nil,
642
- nil,
643
- nil,
644
- nil,
645
- nil,
646
- nil,
647
- nil,
648
- nil,
649
- nil,
650
- nil,
651
- nil,
652
- "cmplx64_t",
653
- "cmplx128_t",
654
- "cmplx256_t",
655
- nil,
656
- ]
657
-
658
- OBJ_TYPES = [
659
- nil,
660
- nil,
661
- nil,
662
- nil,
663
- nil,
664
- nil,
665
- nil,
666
- nil,
667
- nil,
668
- nil,
669
- nil,
670
- nil,
671
- nil,
672
- nil,
673
- nil,
674
- nil,
675
- "VALUE",
676
- ]
677
-
678
- FIXLEN_TYPES = [
679
- "fixlen",
680
- nil,
681
- nil,
682
- nil,
683
- nil,
684
- nil,
685
- nil,
686
- nil,
687
- nil,
688
- nil,
689
- nil,
690
- nil,
691
- nil,
692
- nil,
693
- nil,
694
- nil,
695
- nil,
696
- ]
697
-
698
- begin
699
- open("carray_config.h") { |io|
700
- have_complex = false
701
- while line = io.gets
702
- if line =~ /HAVE_COMPLEX_H\s+(\d*)\s*/
703
- have_complex = ($1.to_i == 1)
704
- break
705
- end
706
- end
707
- HAVE_COMPLEX = have_complex
708
- }
709
- end
710
-
711
- HEADERS = ""
712
- DEFINITIONS = ""
713
- METHODS = ""
714
-
715
- CODETEXT = <<HERE
716
- <headers>
717
-
718
- #include <math.h>
719
- #include "carray.h"
720
-
721
- <definitions>
722
-
723
- void
724
- Init_<name> ()
725
- {
726
- <methods>
727
- }
728
-
729
- HERE
730
-
731
- def create_code (name, filename)
732
- code = CODETEXT.clone
733
- code.sub!("<name>", name)
734
- code.sub!("<headers>", HEADERS)
735
- code.sub!("<definitions>", DEFINITIONS)
736
- code.sub!("<methods>", METHODS)
737
- open(filename, "w") { |io|
738
- io.write code
739
- }
740
- end
741
-