nmatrix-lapacke 0.2.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 (185) hide show
  1. checksums.yaml +7 -0
  2. data/ext/nmatrix/data/complex.h +364 -0
  3. data/ext/nmatrix/data/data.h +638 -0
  4. data/ext/nmatrix/data/meta.h +64 -0
  5. data/ext/nmatrix/data/ruby_object.h +389 -0
  6. data/ext/nmatrix/math/asum.h +120 -0
  7. data/ext/nmatrix/math/cblas_enums.h +36 -0
  8. data/ext/nmatrix/math/cblas_templates_core.h +507 -0
  9. data/ext/nmatrix/math/gemm.h +241 -0
  10. data/ext/nmatrix/math/gemv.h +178 -0
  11. data/ext/nmatrix/math/getrf.h +255 -0
  12. data/ext/nmatrix/math/getrs.h +121 -0
  13. data/ext/nmatrix/math/imax.h +79 -0
  14. data/ext/nmatrix/math/laswp.h +165 -0
  15. data/ext/nmatrix/math/long_dtype.h +49 -0
  16. data/ext/nmatrix/math/math.h +744 -0
  17. data/ext/nmatrix/math/nrm2.h +160 -0
  18. data/ext/nmatrix/math/rot.h +117 -0
  19. data/ext/nmatrix/math/rotg.h +106 -0
  20. data/ext/nmatrix/math/scal.h +71 -0
  21. data/ext/nmatrix/math/trsm.h +332 -0
  22. data/ext/nmatrix/math/util.h +148 -0
  23. data/ext/nmatrix/nm_memory.h +60 -0
  24. data/ext/nmatrix/nmatrix.h +408 -0
  25. data/ext/nmatrix/ruby_constants.h +106 -0
  26. data/ext/nmatrix/storage/common.h +176 -0
  27. data/ext/nmatrix/storage/dense/dense.h +128 -0
  28. data/ext/nmatrix/storage/list/list.h +137 -0
  29. data/ext/nmatrix/storage/storage.h +98 -0
  30. data/ext/nmatrix/storage/yale/class.h +1139 -0
  31. data/ext/nmatrix/storage/yale/iterators/base.h +142 -0
  32. data/ext/nmatrix/storage/yale/iterators/iterator.h +130 -0
  33. data/ext/nmatrix/storage/yale/iterators/row.h +449 -0
  34. data/ext/nmatrix/storage/yale/iterators/row_stored.h +139 -0
  35. data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +168 -0
  36. data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +123 -0
  37. data/ext/nmatrix/storage/yale/math/transpose.h +110 -0
  38. data/ext/nmatrix/storage/yale/yale.h +202 -0
  39. data/ext/nmatrix/types.h +54 -0
  40. data/ext/nmatrix/util/io.h +115 -0
  41. data/ext/nmatrix/util/sl_list.h +143 -0
  42. data/ext/nmatrix/util/util.h +78 -0
  43. data/ext/nmatrix_lapacke/extconf.rb +200 -0
  44. data/ext/nmatrix_lapacke/lapacke.cpp +100 -0
  45. data/ext/nmatrix_lapacke/lapacke/include/lapacke.h +16445 -0
  46. data/ext/nmatrix_lapacke/lapacke/include/lapacke_config.h +119 -0
  47. data/ext/nmatrix_lapacke/lapacke/include/lapacke_mangling.h +17 -0
  48. data/ext/nmatrix_lapacke/lapacke/include/lapacke_mangling_with_flags.h +17 -0
  49. data/ext/nmatrix_lapacke/lapacke/include/lapacke_utils.h +579 -0
  50. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgeev.c +89 -0
  51. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgeev_work.c +141 -0
  52. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgesdd.c +106 -0
  53. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgesdd_work.c +158 -0
  54. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgesvd.c +94 -0
  55. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgesvd_work.c +149 -0
  56. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgetrf.c +51 -0
  57. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgetrf_work.c +83 -0
  58. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgetri.c +77 -0
  59. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgetri_work.c +89 -0
  60. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgetrs.c +56 -0
  61. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgetrs_work.c +102 -0
  62. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cpotrf.c +50 -0
  63. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cpotrf_work.c +82 -0
  64. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cpotri.c +50 -0
  65. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cpotri_work.c +82 -0
  66. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cpotrs.c +55 -0
  67. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cpotrs_work.c +101 -0
  68. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgeev.c +78 -0
  69. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgeev_work.c +136 -0
  70. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgesdd.c +88 -0
  71. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgesdd_work.c +153 -0
  72. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgesvd.c +83 -0
  73. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgesvd_work.c +144 -0
  74. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgetrf.c +50 -0
  75. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgetrf_work.c +81 -0
  76. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgetri.c +75 -0
  77. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgetri_work.c +87 -0
  78. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgetrs.c +55 -0
  79. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgetrs_work.c +99 -0
  80. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dpotrf.c +50 -0
  81. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dpotrf_work.c +81 -0
  82. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dpotri.c +50 -0
  83. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dpotri_work.c +81 -0
  84. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dpotrs.c +54 -0
  85. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dpotrs_work.c +97 -0
  86. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgeev.c +78 -0
  87. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgeev_work.c +134 -0
  88. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgesdd.c +88 -0
  89. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgesdd_work.c +152 -0
  90. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgesvd.c +83 -0
  91. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgesvd_work.c +143 -0
  92. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgetrf.c +50 -0
  93. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgetrf_work.c +81 -0
  94. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgetri.c +75 -0
  95. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgetri_work.c +87 -0
  96. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgetrs.c +55 -0
  97. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgetrs_work.c +99 -0
  98. data/ext/nmatrix_lapacke/lapacke/src/lapacke_spotrf.c +50 -0
  99. data/ext/nmatrix_lapacke/lapacke/src/lapacke_spotrf_work.c +81 -0
  100. data/ext/nmatrix_lapacke/lapacke/src/lapacke_spotri.c +50 -0
  101. data/ext/nmatrix_lapacke/lapacke/src/lapacke_spotri_work.c +81 -0
  102. data/ext/nmatrix_lapacke/lapacke/src/lapacke_spotrs.c +54 -0
  103. data/ext/nmatrix_lapacke/lapacke/src/lapacke_spotrs_work.c +97 -0
  104. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgeev.c +89 -0
  105. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgeev_work.c +141 -0
  106. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgesdd.c +106 -0
  107. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgesdd_work.c +158 -0
  108. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgesvd.c +94 -0
  109. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgesvd_work.c +149 -0
  110. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgetrf.c +51 -0
  111. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgetrf_work.c +83 -0
  112. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgetri.c +77 -0
  113. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgetri_work.c +89 -0
  114. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgetrs.c +56 -0
  115. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgetrs_work.c +102 -0
  116. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zpotrf.c +50 -0
  117. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zpotrf_work.c +82 -0
  118. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zpotri.c +50 -0
  119. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zpotri_work.c +82 -0
  120. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zpotrs.c +55 -0
  121. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zpotrs_work.c +101 -0
  122. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_cge_nancheck.c +62 -0
  123. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_cge_trans.c +65 -0
  124. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_cpo_nancheck.c +43 -0
  125. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_cpo_trans.c +45 -0
  126. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_ctr_nancheck.c +85 -0
  127. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_ctr_trans.c +85 -0
  128. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_dge_nancheck.c +62 -0
  129. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_dge_trans.c +65 -0
  130. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_dpo_nancheck.c +43 -0
  131. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_dpo_trans.c +45 -0
  132. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_dtr_nancheck.c +85 -0
  133. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_dtr_trans.c +85 -0
  134. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_lsame.c +41 -0
  135. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_sge_nancheck.c +62 -0
  136. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_sge_trans.c +65 -0
  137. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_spo_nancheck.c +43 -0
  138. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_spo_trans.c +45 -0
  139. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_str_nancheck.c +85 -0
  140. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_str_trans.c +85 -0
  141. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_xerbla.c +46 -0
  142. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_zge_nancheck.c +62 -0
  143. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_zge_trans.c +65 -0
  144. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_zpo_nancheck.c +43 -0
  145. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_zpo_trans.c +45 -0
  146. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_ztr_nancheck.c +85 -0
  147. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_ztr_trans.c +85 -0
  148. data/ext/nmatrix_lapacke/lapacke_nmatrix.h +16 -0
  149. data/ext/nmatrix_lapacke/make_lapacke_cpp.rb +9 -0
  150. data/ext/nmatrix_lapacke/math_lapacke.cpp +967 -0
  151. data/ext/nmatrix_lapacke/math_lapacke/cblas_local.h +576 -0
  152. data/ext/nmatrix_lapacke/math_lapacke/cblas_templates_lapacke.h +51 -0
  153. data/ext/nmatrix_lapacke/math_lapacke/lapacke_templates.h +356 -0
  154. data/ext/nmatrix_lapacke/nmatrix_lapacke.cpp +42 -0
  155. data/lib/nmatrix/lapack_ext_common.rb +69 -0
  156. data/lib/nmatrix/lapacke.rb +213 -0
  157. data/spec/00_nmatrix_spec.rb +730 -0
  158. data/spec/01_enum_spec.rb +190 -0
  159. data/spec/02_slice_spec.rb +389 -0
  160. data/spec/03_nmatrix_monkeys_spec.rb +78 -0
  161. data/spec/2x2_dense_double.mat +0 -0
  162. data/spec/4x4_sparse.mat +0 -0
  163. data/spec/4x5_dense.mat +0 -0
  164. data/spec/blas_spec.rb +193 -0
  165. data/spec/elementwise_spec.rb +303 -0
  166. data/spec/homogeneous_spec.rb +99 -0
  167. data/spec/io/fortran_format_spec.rb +88 -0
  168. data/spec/io/harwell_boeing_spec.rb +98 -0
  169. data/spec/io/test.rua +9 -0
  170. data/spec/io_spec.rb +149 -0
  171. data/spec/lapack_core_spec.rb +482 -0
  172. data/spec/leakcheck.rb +16 -0
  173. data/spec/math_spec.rb +730 -0
  174. data/spec/nmatrix_yale_resize_test_associations.yaml +2802 -0
  175. data/spec/nmatrix_yale_spec.rb +286 -0
  176. data/spec/plugins/lapacke/lapacke_spec.rb +303 -0
  177. data/spec/rspec_monkeys.rb +56 -0
  178. data/spec/rspec_spec.rb +34 -0
  179. data/spec/shortcuts_spec.rb +310 -0
  180. data/spec/slice_set_spec.rb +157 -0
  181. data/spec/spec_helper.rb +140 -0
  182. data/spec/stat_spec.rb +203 -0
  183. data/spec/test.pcd +20 -0
  184. data/spec/utm5940.mtx +83844 -0
  185. metadata +262 -0
@@ -0,0 +1,60 @@
1
+ /////////////////////////////////////////////////////////////////////
2
+ // = NMatrix
3
+ //
4
+ // A linear algebra library for scientific computation in Ruby.
5
+ // NMatrix is part of SciRuby.
6
+ //
7
+ // NMatrix was originally inspired by and derived from NArray, by
8
+ // Masahiro Tanaka: http://narray.rubyforge.org
9
+ //
10
+ // == Copyright Information
11
+ //
12
+ // SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
13
+ // NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
14
+ //
15
+ // Please see LICENSE.txt for additional copyright notices.
16
+ //
17
+ // == Contributing
18
+ //
19
+ // By contributing source code to SciRuby, you agree to be bound by
20
+ // our Contributor Agreement:
21
+ //
22
+ // * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
23
+ //
24
+ // == nm_memory.h
25
+ //
26
+ // Macros for memory allocation and freeing
27
+
28
+ /**
29
+ * We define these macros, which just call the ruby ones, as this makes
30
+ * debugging memory issues (particularly those involving interaction with
31
+ * the ruby GC) easier, as it's posssible to add debugging code temporarily.
32
+ */
33
+ #ifndef __NM_MEMORY_H__
34
+ #define __NM_MEMORY_H__
35
+
36
+ #include <ruby.h>
37
+
38
+ #define NM_ALLOC(type) (ALLOC(type))
39
+
40
+ #define NM_ALLOC_N(type, n) (ALLOC_N(type, n))
41
+
42
+ #define NM_REALLOC_N(var, type, n) (REALLOC_N(var, type, n))
43
+
44
+ #define NM_ALLOCA_N(type, n) (ALLOCA_N(type, n))
45
+
46
+ #define NM_FREE(var) (xfree(var))
47
+
48
+ #define NM_ALLOC_NONRUBY(type) ((type*) malloc(sizeof(type)))
49
+
50
+ //Defines whether to do conservative gc registrations, i.e. those
51
+ //registrations that we're not that sure are necessary.
52
+ //#define NM_GC_CONSERVATIVE
53
+
54
+ #ifdef NM_GC_CONSERVATIVE
55
+ #define NM_CONSERVATIVE(statement) (statement)
56
+ #else
57
+ #define NM_CONSERVATIVE(statement)
58
+ #endif //NM_GC_CONSERVATIVE
59
+
60
+ #endif
@@ -0,0 +1,408 @@
1
+ /////////////////////////////////////////////////////////////////////
2
+ // = NMatrix
3
+ //
4
+ // A linear algebra library for scientific computation in Ruby.
5
+ // NMatrix is part of SciRuby.
6
+ //
7
+ // NMatrix was originally inspired by and derived from NArray, by
8
+ // Masahiro Tanaka: http://narray.rubyforge.org
9
+ //
10
+ // == Copyright Information
11
+ //
12
+ // SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
13
+ // NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
14
+ //
15
+ // Please see LICENSE.txt for additional copyright notices.
16
+ //
17
+ // == Contributing
18
+ //
19
+ // By contributing source code to SciRuby, you agree to be bound by
20
+ // our Contributor Agreement:
21
+ //
22
+ // * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
23
+ //
24
+ // == nmatrix.h
25
+ //
26
+ // C and C++ API for NMatrix, and main header file.
27
+
28
+ #ifndef NMATRIX_H
29
+ #define NMATRIX_H
30
+
31
+ /*
32
+ * Standard Includes
33
+ */
34
+
35
+ #include <ruby.h>
36
+
37
+ #ifdef __cplusplus
38
+ #include <cmath>
39
+ #include <cstring>
40
+ #else
41
+ #include <math.h>
42
+ #include <string.h>
43
+ #endif
44
+
45
+ #ifdef BENCHMARK
46
+ // SOURCE: http://stackoverflow.com/questions/2349776/how-can-i-benchmark-a-c-program-easily
47
+ #ifdef __cplusplus
48
+ #include <sys/ctime>
49
+ #include <sys/cresource>
50
+ #else
51
+ #include <sys/time.h>
52
+ #include <sys/resource.h>
53
+ #endif
54
+ #endif
55
+
56
+ #ifdef __cplusplus
57
+ #include "nm_memory.h"
58
+ #endif
59
+
60
+ /*
61
+ * Macros
62
+ */
63
+
64
+ #define RUBY_ZERO INT2FIX(0)
65
+
66
+ #ifndef SIZEOF_INT
67
+ #error SIZEOF_INT undefined
68
+ #else
69
+ #if SIZEOF_INT == 8
70
+ #define DEFAULT_DTYPE INT64
71
+ #define SIZE_T INT64
72
+ #else
73
+ #if SIZEOF_INT == 4
74
+ #define DEFAULT_DTYPE INT32
75
+ #define SIZE_T INT32
76
+ #else
77
+ #if SIZEOF_INT == 2
78
+ #define DEFAULT_DTYPE INT16
79
+ #define SIZE_T INT16
80
+ #else
81
+ #error Unhandled SIZEOF_INT -- please #define SIZE_T and DEFAULT_DTYPE manually.
82
+ #endif
83
+ #endif
84
+ #endif
85
+ #endif
86
+
87
+ /*
88
+ * == Macros for Concurrent C and C++ Header Maintenance
89
+ *
90
+ * These macros look complicated, but they're really not so bad. They're also important: they ensure that whether our
91
+ * header file (nmatrix.h) is read by a C++ or a C compiler, all the same data structures and enumerators exist, albeit
92
+ * with slightly different names.
93
+ *
94
+ * "But wait," you say, "You use structs. Structs exist in C and C++. Why use a macro to set them up?"
95
+ *
96
+ * Well, in C, you have to be explicit about what a struct is. You can actually get around that requirement by using a
97
+ * typedef:
98
+ *
99
+ * typedef struct STORAGE { ... } STORAGE;
100
+ *
101
+ * Also, we use C++ inheritance, which is obviously not allowed in C. So we have to ensure that the base class's members
102
+ * are exposed properly to our child classes.
103
+ *
104
+ * The macros also allow us to put all of our C++ types into namespaces. For C, we prefix everything with either nm_ or
105
+ * NM_ to distinguish our declarations from those in other libraries.
106
+ */
107
+
108
+
109
+ #ifdef __cplusplus /* These are the C++ versions of the macros. */
110
+
111
+ /*
112
+ * If no block is given, return an enumerator. This copied straight out of ruby's include/ruby/intern.h.
113
+ *
114
+ * rb_enumeratorize is located in enumerator.c.
115
+ *
116
+ * VALUE rb_enumeratorize(VALUE obj, VALUE meth, int argc, VALUE *argv) {
117
+ * return enumerator_init(enumerator_allocate(rb_cEnumerator), obj, meth, argc, argv);
118
+ * }
119
+ */
120
+
121
+ //opening portion -- this allows unregistering any objects in use before returning
122
+ #define RETURN_SIZED_ENUMERATOR_PRE do { \
123
+ if (!rb_block_given_p()) {
124
+
125
+ //remaining portion
126
+ #ifdef RUBY_2
127
+ #ifndef RETURN_SIZED_ENUMERATOR
128
+ #undef RETURN_SIZED_ENUMERATOR
129
+ // Ruby 2.0 and higher has rb_enumeratorize_with_size instead of rb_enumeratorize.
130
+ // We want to support both in the simplest way possible.
131
+ #define RETURN_SIZED_ENUMERATOR(obj, argc, argv, size_fn) \
132
+ return rb_enumeratorize_with_size((obj), ID2SYM(rb_frame_this_func()), (argc), (argv), (size_fn)); \
133
+ } \
134
+ } while (0)
135
+ #endif
136
+ #else
137
+ #undef RETURN_SIZED_ENUMERATOR
138
+ #define RETURN_SIZED_ENUMERATOR(obj, argc, argv, size_fn) \
139
+ return rb_enumeratorize((obj), ID2SYM(rb_frame_this_func()), (argc), (argv)); \
140
+ } \
141
+ } while (0)
142
+ #endif
143
+
144
+ #define NM_DECL_ENUM(enum_type, name) nm::enum_type name
145
+ #define NM_DECL_STRUCT(type, name) type name;
146
+
147
+ #define NM_DEF_STORAGE_ELEMENTS \
148
+ NM_DECL_ENUM(dtype_t, dtype); \
149
+ size_t dim; \
150
+ size_t* shape; \
151
+ size_t* offset; \
152
+ int count; \
153
+ STORAGE* src;
154
+
155
+ #define NM_DEF_STORAGE_CHILD_STRUCT_PRE(name) struct name : STORAGE {
156
+ #define NM_DEF_STORAGE_STRUCT_POST(name) };
157
+
158
+ #define NM_DEF_STORAGE_STRUCT \
159
+ struct STORAGE { \
160
+ NM_DEF_STORAGE_ELEMENTS; \
161
+ };
162
+
163
+ #define NM_DEF_STRUCT_PRE(name) struct name {
164
+ #define NM_DEF_STRUCT_POST(name) };
165
+
166
+ #define NM_DEF_ENUM(name, ...) \
167
+ namespace nm { \
168
+ enum name { \
169
+ __VA_ARGS__ \
170
+ }; \
171
+ } // end of namespace nm
172
+
173
+ #else /* These are the C versions of the macros. */
174
+
175
+ #define NM_DECL_ENUM(enum_type, name) nm_ ## enum_type name
176
+ #define NM_DECL_STRUCT(type, name) struct NM_ ## type name;
177
+
178
+ #define NM_DEF_STORAGE_ELEMENTS \
179
+ NM_DECL_ENUM(dtype_t, dtype); \
180
+ size_t dim; \
181
+ size_t* shape; \
182
+ size_t* offset; \
183
+ int count; \
184
+ NM_DECL_STRUCT(STORAGE*, src);
185
+ #define NM_DEF_STORAGE_CHILD_STRUCT_PRE(name) typedef struct NM_ ## name { \
186
+ NM_DEF_STORAGE_ELEMENTS;
187
+
188
+ #define NM_DEF_STORAGE_STRUCT_POST(name) } NM_ ## name;
189
+
190
+ #define NM_DEF_STORAGE_STRUCT \
191
+ typedef struct NM_STORAGE { \
192
+ NM_DEF_STORAGE_ELEMENTS; \
193
+ } NM_STORAGE;
194
+
195
+ #define NM_DEF_STRUCT_PRE(name) typedef struct NM_ ## name {
196
+ #define NM_DEF_STRUCT_POST(name) } NM_ ## name;
197
+
198
+ #define NM_DEF_ENUM(name, ...) \
199
+ typedef enum nm_ ## name { \
200
+ __VA_ARGS__ \
201
+ } nm_ ## name;
202
+
203
+ #endif /* End of C/C++ Parallel Header Macro Definitions */
204
+
205
+
206
+ /*
207
+ * Types
208
+ */
209
+
210
+ #define NM_NUM_DTYPES 10 // data/data.h
211
+ #define NM_NUM_STYPES 3 // storage/storage.h
212
+
213
+ //#ifdef __cplusplus
214
+ //namespace nm {
215
+ //#endif
216
+
217
+ /* Storage Type -- Dense or Sparse */
218
+ NM_DEF_ENUM(stype_t, DENSE_STORE = 0,
219
+ LIST_STORE = 1,
220
+ YALE_STORE = 2);
221
+
222
+ /* Data Type */
223
+ NM_DEF_ENUM(dtype_t, BYTE = 0, // unsigned char
224
+ INT8 = 1, // char
225
+ INT16 = 2, // short
226
+ INT32 = 3, // int
227
+ INT64 = 4, // long
228
+ FLOAT32 = 5, // float
229
+ FLOAT64 = 6, // double
230
+ COMPLEX64 = 7, // Complex64 class
231
+ COMPLEX128 = 8, // Complex128 class
232
+ RUBYOBJ = 9); // Ruby VALUE type
233
+
234
+ NM_DEF_ENUM(symm_t, NONSYMM = 0,
235
+ SYMM = 1,
236
+ SKEW = 2,
237
+ HERM = 3,
238
+ UPPER = 4,
239
+ LOWER = 5);
240
+
241
+ //#ifdef __cplusplus
242
+ //}; // end of namespace nm
243
+ //#endif
244
+
245
+ /* struct STORAGE */
246
+ NM_DEF_STORAGE_STRUCT;
247
+
248
+ /* Dense Storage */
249
+ NM_DEF_STORAGE_CHILD_STRUCT_PRE(DENSE_STORAGE); // struct DENSE_STORAGE : STORAGE {
250
+ void* elements; // should go first to align with void* a in yale and NODE* first in list.
251
+ size_t* stride;
252
+ NM_DEF_STORAGE_STRUCT_POST(DENSE_STORAGE); // };
253
+
254
+ /* Yale Storage */
255
+ NM_DEF_STORAGE_CHILD_STRUCT_PRE(YALE_STORAGE);
256
+ void* a; // should go first
257
+ size_t ndnz; // Strictly non-diagonal non-zero count!
258
+ size_t capacity;
259
+ size_t* ija;
260
+ NM_DEF_STORAGE_STRUCT_POST(YALE_STORAGE);
261
+
262
+ // FIXME: NODE and LIST should be put in some kind of namespace or something, at least in C++.
263
+ NM_DEF_STRUCT_PRE(NODE); // struct NODE {
264
+ size_t key;
265
+ void* val;
266
+ NM_DECL_STRUCT(NODE*, next); // NODE* next;
267
+ NM_DEF_STRUCT_POST(NODE); // };
268
+
269
+ NM_DEF_STRUCT_PRE(LIST); // struct LIST {
270
+ NM_DECL_STRUCT(NODE*, first); // NODE* first;
271
+ NM_DEF_STRUCT_POST(LIST); // };
272
+
273
+ /* List-of-Lists Storage */
274
+ NM_DEF_STORAGE_CHILD_STRUCT_PRE(LIST_STORAGE); // struct LIST_STORAGE : STORAGE {
275
+ // List storage specific elements.
276
+ void* default_val;
277
+ NM_DECL_STRUCT(LIST*, rows); // LIST* rows;
278
+ NM_DEF_STORAGE_STRUCT_POST(LIST_STORAGE); // };
279
+
280
+
281
+
282
+ /* NMATRIX Object */
283
+ NM_DEF_STRUCT_PRE(NMATRIX); // struct NMATRIX {
284
+ NM_DECL_ENUM(stype_t, stype); // stype_t stype; // Method of storage (csc, dense, etc).
285
+ NM_DECL_STRUCT(STORAGE*, storage); // STORAGE* storage; // Pointer to storage struct.
286
+ NM_DEF_STRUCT_POST(NMATRIX); // };
287
+
288
+ /* Structs for dealing with VALUEs in use so that they don't get GC'd */
289
+
290
+ NM_DEF_STRUCT_PRE(NM_GC_LL_NODE); // struct NM_GC_LL_NODE {
291
+ VALUE* val; // VALUE* val;
292
+ size_t n; // size_t n;
293
+ NM_DECL_STRUCT(NM_GC_LL_NODE*, next); // NM_GC_LL_NODE* next;
294
+ NM_DEF_STRUCT_POST(NM_GC_LL_NODE); // };
295
+
296
+ NM_DEF_STRUCT_PRE(NM_GC_HOLDER); // struct NM_GC_HOLDER {
297
+ NM_DECL_STRUCT(NM_GC_LL_NODE*, start); // NM_GC_LL_NODE* start;
298
+ NM_DEF_STRUCT_POST(NM_GC_HOLDER); // };
299
+
300
+ #define NM_MAX_RANK 15
301
+
302
+ #define UnwrapNMatrix(obj,var) Data_Get_Struct(obj, NMATRIX, var)
303
+
304
+ #define NM_STORAGE(val) (NM_STRUCT(val)->storage)
305
+ #ifdef __cplusplus
306
+ #define NM_STRUCT(val) ((NMATRIX*)(DATA_PTR(val)))
307
+ #define NM_STORAGE_LIST(val) ((LIST_STORAGE*)(NM_STORAGE(val)))
308
+ #define NM_STORAGE_YALE(val) ((YALE_STORAGE*)(NM_STORAGE(val)))
309
+ #define NM_STORAGE_DENSE(val) ((DENSE_STORAGE*)(NM_STORAGE(val)))
310
+ #else
311
+ #define NM_STRUCT(val) ((struct NM_NMATRIX*)(DATA_PTR(val)))
312
+ #define NM_STORAGE_LIST(val) ((struct NM_LIST_STORAGE*)(NM_STORAGE(val)))
313
+ #define NM_STORAGE_YALE(val) ((struct NM_YALE_STORAGE*)(NM_STORAGE(val)))
314
+ #define NM_STORAGE_DENSE(val) ((struct NM_DENSE_STORAGE*)(NM_STORAGE(val)))
315
+ #endif
316
+
317
+ #define NM_SRC(val) (NM_STORAGE(val)->src)
318
+ #define NM_DIM(val) (NM_STORAGE(val)->dim)
319
+ #define NM_DTYPE(val) (NM_STORAGE(val)->dtype)
320
+ #define NM_STYPE(val) (NM_STRUCT(val)->stype)
321
+ #define NM_SHAPE(val,i) (NM_STORAGE(val)->shape[(i)])
322
+ #define NM_SHAPE0(val) (NM_STORAGE(val)->shape[0])
323
+ #define NM_SHAPE1(val) (NM_STORAGE(val)->shape[1])
324
+ #define NM_DEFAULT_VAL(val) (NM_STORAGE_LIST(val)->default_val)
325
+
326
+ #define NM_DENSE_COUNT(val) (nm_storage_count_max_elements(NM_STORAGE_DENSE(val)))
327
+ #define NM_DENSE_ELEMENTS(val) (NM_STORAGE_DENSE(val)->elements)
328
+ #define NM_SIZEOF_DTYPE(val) (DTYPE_SIZES[NM_DTYPE(val)])
329
+ #define NM_REF(val,slice) (RefFuncs[NM_STYPE(val)]( NM_STORAGE(val), slice, NM_SIZEOF_DTYPE(val) ))
330
+
331
+ #define NM_MAX(a,b) (((a)>(b))?(a):(b))
332
+ #define NM_MIN(a,b) (((a)>(b))?(b):(a))
333
+ #define NM_SWAP(a,b,tmp) {(tmp)=(a);(a)=(b);(b)=(tmp);}
334
+
335
+ #define NM_CHECK_ALLOC(x) if (!x) rb_raise(rb_eNoMemError, "insufficient memory");
336
+
337
+ #define RB_FILE_EXISTS(fn) (rb_funcall(rb_const_get(rb_cObject, rb_intern("File")), rb_intern("exists?"), 1, (fn)) == Qtrue)
338
+
339
+ #define CheckNMatrixType(v) if (TYPE(v) != T_DATA || (RDATA(v)->dfree != (RUBY_DATA_FUNC)nm_delete && RDATA(v)->dfree != (RUBY_DATA_FUNC)nm_delete_ref)) rb_raise(rb_eTypeError, "expected NMatrix on left-hand side of operation");
340
+
341
+ #define NM_IsNMatrix(obj) \
342
+ (rb_obj_is_kind_of(obj, cNMatrix) == Qtrue)
343
+
344
+ #define NM_IsNVector(obj) \
345
+ (rb_obj_is_kind_of(obj, cNVector) == Qtrue)
346
+
347
+ #define RB_P(OBJ) \
348
+ rb_funcall(rb_stderr, rb_intern("print"), 1, rb_funcall(OBJ, rb_intern("object_id"), 0)); \
349
+ rb_funcall(rb_stderr, rb_intern("puts"), 1, rb_funcall(OBJ, rb_intern("inspect"), 0));
350
+
351
+
352
+ #ifdef __cplusplus
353
+ typedef VALUE (*METHOD)(...);
354
+
355
+ //}; // end of namespace nm
356
+ #endif
357
+
358
+ // In the init code below, we need to use NMATRIX for c++ and NM_NMATRIX for c
359
+ // this macro chooses the correct one:
360
+ #ifdef __cplusplus
361
+ #define _NMATRIX NMATRIX
362
+ #define _STORAGE STORAGE
363
+ #else
364
+ #define _NMATRIX NM_NMATRIX
365
+ #define _STORAGE NM_STORAGE
366
+ #endif
367
+
368
+ /*
369
+ * Functions
370
+ */
371
+
372
+ #ifdef __cplusplus
373
+ extern "C" {
374
+ #endif
375
+
376
+ void Init_nmatrix();
377
+ // External API
378
+ VALUE rb_nmatrix_dense_create(NM_DECL_ENUM(dtype_t, dtype), size_t* shape, size_t dim, void* elements, size_t length);
379
+ VALUE rb_nvector_dense_create(NM_DECL_ENUM(dtype_t, dtype), void* elements, size_t length);
380
+
381
+ NM_DECL_ENUM(dtype_t, nm_dtype_guess(VALUE)); // (This is a function)
382
+ NM_DECL_ENUM(dtype_t, nm_dtype_min(VALUE));
383
+
384
+ // Non-API functions needed by other cpp files.
385
+ _NMATRIX* nm_create(NM_DECL_ENUM(stype_t, stype), _STORAGE* storage);
386
+ _NMATRIX* nm_cast_with_ctype_args(_NMATRIX* self, NM_DECL_ENUM(stype_t, new_stype), NM_DECL_ENUM(dtype_t, new_dtype), void* init_ptr);
387
+ VALUE nm_cast(VALUE self, VALUE new_stype_symbol, VALUE new_dtype_symbol, VALUE init);
388
+ void nm_mark(_NMATRIX* mat);
389
+ void nm_delete(_NMATRIX* mat);
390
+ void nm_delete_ref(_NMATRIX* mat);
391
+ void nm_register_values(VALUE* vals, size_t n);
392
+ void nm_register_value(VALUE* val);
393
+ void nm_unregister_value(VALUE* val);
394
+ void nm_unregister_values(VALUE* vals, size_t n);
395
+ void nm_register_storage(NM_DECL_ENUM(stype_t, stype), const _STORAGE* storage);
396
+ void nm_unregister_storage(NM_DECL_ENUM(stype_t, stype), const _STORAGE* storage);
397
+ void nm_register_nmatrix(_NMATRIX* nmatrix);
398
+ void nm_unregister_nmatrix(_NMATRIX* nmatrix);
399
+ void nm_completely_unregister_value(VALUE* val);
400
+
401
+ #ifdef __cplusplus
402
+ }
403
+ #endif
404
+
405
+ #undef _NMATRIX
406
+ #undef _STORAGE
407
+
408
+ #endif // NMATRIX_H