kmat 0.0.3 → 0.1.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.
@@ -21,7 +21,7 @@ kmm_MATH_log1p(VALUE self, VALUE x)
21
21
  VALUE
22
22
  kmm_float_sign(VALUE self)
23
23
  {
24
- double x = NUM2DBL(self);
24
+ const double x = NUM2DBL(self);
25
25
  if ( x == 0.0 ) {
26
26
  return INT2NUM(0);
27
27
  } else if ( x > 0.0 ) {
@@ -71,61 +71,61 @@ km_sum_all_v(VALUE *ent, void *data)
71
71
  *ret = rb_funcall(*ret, id_op_plus, 1, *ent);
72
72
  }
73
73
  void
74
- km_sum_col_d(double *ent, int i, int j, void *data)
74
+ km_sum_col_d(double *ent, size_t i, size_t j, void *data)
75
75
  {
76
76
  double *r = (double *)data;
77
77
  r[j] += *ent;
78
78
  }
79
79
  void
80
- km_sum_col_z(COMPLEX *ent, int i, int j, void *data)
80
+ km_sum_col_z(COMPLEX *ent, size_t i, size_t j, void *data)
81
81
  {
82
82
  COMPLEX *r = (COMPLEX *)data;
83
83
  r[j] += *ent;
84
84
  }
85
85
  void
86
- km_sum_col_i(int *ent, int i, int j, void *data)
86
+ km_sum_col_i(int *ent, size_t i, size_t j, void *data)
87
87
  {
88
88
  int *r = (int *)data;
89
89
  r[j] += *ent;
90
90
  }
91
91
  void
92
- km_sum_col_b(bool *ent, int i, int j, void *data)
92
+ km_sum_col_b(bool *ent, size_t i, size_t j, void *data)
93
93
  {
94
94
  bool *r = (bool *)data;
95
95
  r[j] = XOR(r[j], *ent);
96
96
  }
97
97
  void
98
- km_sum_col_v(VALUE *ent, int i, int j, void *data)
98
+ km_sum_col_v(VALUE *ent, size_t i, size_t j, void *data)
99
99
  {
100
100
  VALUE *r = (VALUE *)data;
101
101
  r[j] = rb_funcall(r[j], id_op_plus, 1, *ent);
102
102
  }
103
103
  void
104
- km_sum_row_d(double *ent, int i, int j, void *data)
104
+ km_sum_row_d(double *ent, size_t i, size_t j, void *data)
105
105
  {
106
106
  double *r = (double *)data;
107
107
  r[i] += *ent;
108
108
  }
109
109
  void
110
- km_sum_row_z(COMPLEX *ent, int i, int j, void *data)
110
+ km_sum_row_z(COMPLEX *ent, size_t i, size_t j, void *data)
111
111
  {
112
112
  COMPLEX *r = (COMPLEX *)data;
113
113
  r[i] += *ent;
114
114
  }
115
115
  void
116
- km_sum_row_i(int *ent, int i, int j, void *data)
116
+ km_sum_row_i(int *ent, size_t i, size_t j, void *data)
117
117
  {
118
118
  int *r = (int *)data;
119
119
  r[i] += *ent;
120
120
  }
121
121
  void
122
- km_sum_row_b(bool *ent, int i, int j, void *data)
122
+ km_sum_row_b(bool *ent, size_t i, size_t j, void *data)
123
123
  {
124
124
  bool *r = (bool *)data;
125
125
  r[i] = XOR(r[i], *ent);
126
126
  }
127
127
  void
128
- km_sum_row_v(VALUE *ent, int i, int j, void *data)
128
+ km_sum_row_v(VALUE *ent, size_t i, size_t j, void *data)
129
129
  {
130
130
  VALUE *r = (VALUE *)data;
131
131
  r[i] = rb_funcall(r[i], id_op_plus, 1, *ent);
@@ -167,7 +167,7 @@ kmm_mat__sum(VALUE self, VALUE dest)
167
167
  } else if ( SAME_SIZE(sr, sa) ) {
168
168
  km_smat_copy(sr, sa);
169
169
  } else {
170
- rb_raise(km_eDim, "sum from size (%d, %d) to size (%d, %d) is not defined", sa->m, sa->n, sr->m, sr->n);
170
+ rb_raise(km_eDim, "sum from size (%zu, %zu) to size (%zu, %zu) is not defined", sa->m, sa->n, sr->m, sr->n);
171
171
  }
172
172
  return dest;
173
173
  }
@@ -123,28 +123,28 @@ VALUE
123
123
  kmm_mat_trace(VALUE self)
124
124
  {
125
125
  SMAT *smat = km_mat2smat(self);
126
- int len = MIN(smat->m, smat->n);
126
+ const size_t len = MIN(smat->m, smat->n);
127
127
  if ( smat->vtype == VT_DOUBLE ) {
128
128
  double ret = 0.0;
129
- for ( int i=0; i<len; i++ ) {
129
+ for ( size_t i=0; i<len; i++ ) {
130
130
  ret += ENTITY(smat, d, i, i);
131
131
  }
132
132
  return rb_float_new(ret);
133
133
  } else if ( smat->vtype == VT_COMPLEX ) {
134
134
  COMPLEX ret = cpack(0.0, 0.0);
135
- for ( int i=0; i<len; i++ ) {
135
+ for ( size_t i=0; i<len; i++ ) {
136
136
  ret += ENTITY(smat, z, i, i);
137
137
  }
138
138
  return km_c2v(ret);
139
139
  } else if ( smat->vtype == VT_INT ) {
140
140
  int ret = 0;
141
- for ( int i=0; i<len; i++ ) {
141
+ for ( size_t i=0; i<len; i++ ) {
142
142
  ret += ENTITY(smat, i, i, i);
143
143
  }
144
144
  return INT2NUM(ret);
145
145
  } else if ( smat->vtype == VT_BOOL ) {
146
146
  bool ret = false;
147
- for ( int i=0; i<len; i++ ) {
147
+ for ( size_t i=0; i<len; i++ ) {
148
148
  bool ent = ENTITY(smat, b, i, i);
149
149
  ret = XOR(ret, ent);
150
150
  }
@@ -154,7 +154,7 @@ kmm_mat_trace(VALUE self)
154
154
  return INT2NUM(0);
155
155
  } else {
156
156
  VALUE ret = ENTITY(smat, v, 0, 0);
157
- for ( int i=1; i<len; i++ ) {
157
+ for ( size_t i=1; i<len; i++ ) {
158
158
  ret = rb_funcall(ret, id_op_plus, 1, ENTITY(smat, v, i, i));
159
159
  }
160
160
  return ret;
data/ext/kmat/extconf.rb CHANGED
@@ -48,6 +48,9 @@ File.open('./__Makefile__temp__', 'w') do |f|
48
48
  else
49
49
  line.sub!(/^debugflags.+/, 'debugflags =')
50
50
  end
51
+ line.gsub!(/\-I\$\(hdrdir\)/, '-isystem$(hdrdir)')
52
+ line.gsub!(/\-I\$\(arch\_hdrdir\)/, '-isystem$(arch_hdrdir)')
53
+ line.gsub!(/\-I\//, '-isystem/')
51
54
  f.puts line
52
55
  end
53
56
  end
data/ext/kmat/km_util.h CHANGED
@@ -1,9 +1,27 @@
1
1
  static inline size_t
2
- int2size_t(int i)
2
+ i2s(int i)
3
3
  {
4
4
  return (size_t)i;
5
5
  }
6
6
 
7
+ static inline int
8
+ s2i(size_t s)
9
+ {
10
+ return (int)s;
11
+ }
12
+
13
+ static inline long
14
+ s2l(size_t s)
15
+ {
16
+ return (long)s;
17
+ }
18
+
19
+ static inline size_t
20
+ l2s(long l)
21
+ {
22
+ return (size_t)l;
23
+ }
24
+
7
25
  static inline void
8
26
  km_check_frozen(VALUE obj)
9
27
  {
@@ -21,11 +39,9 @@ km_infect_frozen(VALUE src, VALUE dest)
21
39
  }
22
40
 
23
41
  static inline void
24
- km_check_positive(int m, int n)
42
+ km_check_size2(size_t m, size_t n)
25
43
  {
26
- if ( m < 0 || n < 0 ) {
27
- rb_raise(km_eDim, "matrix size must not be negative");
28
- } else if ( ((long long)m)*((long long)n) != (long long)(m*n) ) {
44
+ if ( ((long long)m)*((long long)n) != (long long)(m*n) ) {
29
45
  rb_raise(km_eDim, "matrix length must be within int range");
30
46
  }
31
47
  }
@@ -37,21 +53,26 @@ km_check_positive(int m, int n)
37
53
  #define SAME(a, b) ( (a) == (b) )
38
54
  #define XOR(p, q) ( ( (p)&&(!(q)) ) || ( (!(p))&&(q) ) )
39
55
 
40
- #define KALLOC(val, n) val = ruby_xcalloc(int2size_t(n), sizeof(*(val)))
56
+ #define ZU2NUM(n) ULONG2NUM(n)
57
+ #define NUM2ZU(x) NUM2ULONG(x)
58
+
59
+ #define KALLOCs(val, n) val = ruby_xcalloc(n, sizeof(*(val)))
60
+ #define KALLOC(val, n) val = ruby_xcalloc(i2s(n), sizeof(*(val)))
41
61
  #define KALLOCc(work, smat) work = km_alloc_and_copy(smat)
42
62
  #define KALLOCn(work, smat) km_alloc_and_copy_if_needed(smat, &(work))
43
63
  #define KALLOCz(work, smat) km_alloc_if_needed_and_0clear(smat, &(work))
44
64
 
45
65
  #define INDEX(smat, i, j) ( (smat)->trans ? ((j)+(i)*(smat)->ld) : ((i)+(j)*(smat)->ld) )
66
+ #define INDEXi(smat, i, j) s2i( (smat)->trans ? ((j)+(i)*(smat)->ld) : ((i)+(j)*(smat)->ld) )
46
67
  #define ENTITYd0(smat, id, idx) ( ((smat)->id##body)[idx] )
47
68
  #define ENTITYr0(smat, id, idx) ( *( ((smat)->id##pbody)[idx] ) )
48
69
  #define ENTITY(smat, id, i, j) ( ( (smat)->stype==ST_RSUB ) ? ENTITYr0(smat, id, INDEX(smat, i, j)) : ENTITYd0(smat, id, INDEX(smat, i, j)) )
49
70
 
71
+ #define LENGTHi(smat) s2i( (smat)->m*(smat)->n )
50
72
  #define LENGTH(smat) ( (smat)->m*(smat)->n )
51
- #define LENGTHs(smat) int2size_t( (smat)->m*(smat)->n )
52
73
  #define VECTOR_P(smat) ( (smat)->m==1 || (smat)->n==1 )
53
74
  #define SAME_SIZE(sa, sb) ( ( (sa)->m==(sb)->m ) && ( (sa)->n==(sb)->n ) )
54
- #define CHECK_SAME_SIZE(sa, sb) do { if ( !SAME_SIZE(sa, sb) ) { rb_raise(km_eDim, "sizes must be the same, (%d, %d) != (%d, %d)", (sa)->m, (sa)->n, (sb)->m, (sb)->n); } } while (0)
75
+ #define CHECK_SAME_SIZE(sa, sb) do { if ( !SAME_SIZE(sa, sb) ) { rb_raise(km_eDim, "sizes must be the same, (%zu, %zu) != (%zu, %zu)", (sa)->m, (sa)->n, (sb)->m, (sb)->n); } } while (0)
55
76
 
56
77
  #define VT_SWITCH(vt_, dstate, zstate, istate, bstate, vstate) do { \
57
78
  VTYPE __vt__ = (vt_); \
@@ -69,11 +90,11 @@ void km_smat_each_z(SMAT *smat, void (*func)(COMPLEX *, void *), void *data);
69
90
  void km_smat_each_i(SMAT *smat, void (*func)(int *, void *), void *data);
70
91
  void km_smat_each_b(SMAT *smat, void (*func)(bool *, void *), void *data);
71
92
  void km_smat_each_v(SMAT *smat, void (*func)(VALUE *, void *), void *data);
72
- void km_smat_each_with_index_d(SMAT *smat, void (*func)(double *, int, int, void *), void *data);
73
- void km_smat_each_with_index_z(SMAT *smat, void (*func)(COMPLEX *, int, int, void *), void *data);
74
- void km_smat_each_with_index_i(SMAT *smat, void (*func)(int *, int, int, void *), void *data);
75
- void km_smat_each_with_index_b(SMAT *smat, void (*func)(bool *, int, int, void *), void *data);
76
- void km_smat_each_with_index_v(SMAT *smat, void (*func)(VALUE *, int, int, void *), void *data);
93
+ void km_smat_each_with_index_d(SMAT *smat, void (*func)(double *, size_t, size_t, void *), void *data);
94
+ void km_smat_each_with_index_z(SMAT *smat, void (*func)(COMPLEX *, size_t, size_t, void *), void *data);
95
+ void km_smat_each_with_index_i(SMAT *smat, void (*func)(int *, size_t, size_t, void *), void *data);
96
+ void km_smat_each_with_index_b(SMAT *smat, void (*func)(bool *, size_t, size_t, void *), void *data);
97
+ void km_smat_each_with_index_v(SMAT *smat, void (*func)(VALUE *, size_t, size_t, void *), void *data);
77
98
  void km_smat_each2_d(SMAT *sa, SMAT *sb, void (*func)(double *, double *, void *), void *data);
78
99
  void km_smat_each2_z(SMAT *sa, SMAT *sb, void (*func)(COMPLEX *, COMPLEX *, void *), void *data);
79
100
  void km_smat_each2_i(SMAT *sa, SMAT *sb, void (*func)(int *, int *, void *), void *data);
data/ext/kmat/kmat.h CHANGED
@@ -12,7 +12,7 @@
12
12
  #include "lapack_headers/lapacke_utils.h"
13
13
 
14
14
  #ifndef M_PI
15
- #define M_PI 3.14159265358979323846
15
+ # define M_PI 3.14159265358979323846
16
16
  #endif
17
17
  #define M_2PI 6.28318530717958647692
18
18
  #define COMPLEX double _Complex
@@ -57,7 +57,7 @@ typedef struct {
57
57
  bool **bpbody;
58
58
  VALUE **vpbody;
59
59
  };
60
- int ld, m, n;
60
+ size_t ld, m, n;
61
61
  VTYPE vtype;
62
62
  STYPE stype;
63
63
  bool trans, may_have_sub;
@@ -79,7 +79,7 @@ typedef struct {
79
79
  bool *b;
80
80
  VALUE *v;
81
81
  };
82
- int ld;
82
+ size_t ld;
83
83
  bool need_to_free;
84
84
  } LAWORK;
85
85