pspline 5.0.5 → 5.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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -5
  3. data/README.md +44 -43
  4. data/Rakefile +6 -6
  5. data/bin/console +14 -14
  6. data/bin/setup +8 -8
  7. data/ext/pspline/basis.cpp +394 -351
  8. data/ext/pspline/example/exbspline.rb +57 -57
  9. data/ext/pspline/example/excspline.rb +57 -57
  10. data/ext/pspline/example/exdspline.rb +55 -55
  11. data/ext/pspline/example/exfspline.rb +44 -44
  12. data/ext/pspline/example/exfspline1.rb +40 -40
  13. data/ext/pspline/example/exfspline2.rb +68 -68
  14. data/ext/pspline/example/exfspline3.rb +64 -64
  15. data/ext/pspline/example/exmspline.rb +68 -68
  16. data/ext/pspline/example/expspline.rb +29 -29
  17. data/ext/pspline/example/expspline1.rb +29 -29
  18. data/ext/pspline/example/expspline2.rb +47 -47
  19. data/ext/pspline/example/exqspline.rb +31 -31
  20. data/ext/pspline/example/exqspline1.rb +31 -31
  21. data/ext/pspline/example/exqspline2.rb +50 -50
  22. data/ext/pspline/example/exqspline3.rb +51 -51
  23. data/ext/pspline/example/exqspline4.rb +35 -35
  24. data/ext/pspline/example/exrspline.rb +34 -34
  25. data/ext/pspline/example/exrspline1.rb +34 -34
  26. data/ext/pspline/example/exrspline2.rb +44 -44
  27. data/ext/pspline/example/exsspline.rb +35 -35
  28. data/ext/pspline/example/exsspline1.rb +35 -35
  29. data/ext/pspline/example/extspline.rb +54 -54
  30. data/ext/pspline/extconf.rb +7 -7
  31. data/ext/pspline/fft.cpp +27 -552
  32. data/ext/pspline/include/basis/basis.h +145 -137
  33. data/ext/pspline/include/basis/fft.h +188 -152
  34. data/ext/pspline/include/basis/fft_complex.h +215 -0
  35. data/ext/pspline/include/basis/fft_real.h +625 -0
  36. data/ext/pspline/include/basis/gabs.h +35 -0
  37. data/ext/pspline/include/basis/marray_class_ext.h +568 -0
  38. data/ext/pspline/include/basis/marray_ext.h +100 -0
  39. data/ext/pspline/include/basis/matrix_luc_ext.h +300 -0
  40. data/ext/pspline/include/basis/matrix_lud_ext.h +298 -0
  41. data/ext/pspline/include/basis/poly.h +454 -0
  42. data/ext/pspline/include/basis/poly_array.h +1030 -1568
  43. data/ext/pspline/include/basis/pspline.h +806 -642
  44. data/ext/pspline/include/basis/real.h +526 -0
  45. data/ext/pspline/include/basis/real_inline.h +442 -0
  46. data/ext/pspline/include/basis/spline.h +83 -0
  47. data/ext/pspline/include/basis/uspline.h +251 -210
  48. data/ext/pspline/include/basis/util.h +122 -656
  49. data/ext/pspline/include/bspline.h +71 -377
  50. data/ext/pspline/include/bspline_Config.h +8 -2
  51. data/ext/pspline/include/real_config.h +3 -0
  52. data/ext/pspline/pspline.cpp +1236 -1038
  53. data/ext/pspline/real.cpp +1607 -0
  54. data/ext/pspline/real_const.cpp +585 -0
  55. data/lib/pspline.rb +71 -71
  56. data/lib/pspline/version.rb +1 -1
  57. data/pspline.gemspec +25 -25
  58. metadata +17 -5
  59. data/ext/pspline/plotsub.cpp +0 -139
  60. data/ext/pspline/util.cpp +0 -483
@@ -0,0 +1,454 @@
1
+ #ifndef _POLY_H_
2
+ #define _POLY_H_
3
+
4
+ template <typename T>
5
+ void poly_subst(int n, T *w)
6
+ {
7
+ for (int i = 0; i <= n; ++i) w[i] = T(0);
8
+ }
9
+
10
+ template <typename T, class... Args>
11
+ void poly_subst(int n, T *w, T car, Args... cdr)
12
+ {
13
+ w[0] = car; if (n > 0) poly_subst<T>(n-1, &w[1], cdr...);
14
+ }
15
+
16
+ /*******************************************************************************
17
+ poly<T,N>(T[N]);
18
+ [T0,...,TN]
19
+ *******************************************************************************/
20
+ template<typename T> class poly
21
+ {
22
+
23
+ size_t N; T *w; // data fields
24
+
25
+ public:
26
+ // constructor
27
+ poly() : N(0), w(NULL) {}
28
+ // poly<N>(T0, ...);
29
+ template<class... Args>
30
+ poly(const T car, const Args... cdr) : N(sizeof...(cdr)), w(new T[N])
31
+ {
32
+ w[0] = car; if (N > 0) poly_subst(N-1, &w[1], cdr...);
33
+ }
34
+ // copy construtor
35
+ poly(const poly& p) : N(p.N), w(new T[N])
36
+ {
37
+ for (size_t i = 0; i <= N; i++) w[i] = p.w[i];
38
+ }
39
+ // default destructor
40
+ ~poly() { delete[] w; }
41
+ // assignment operator
42
+ poly& operator = (const poly& p)
43
+ {
44
+ if (this != &p) {
45
+ delete[] w;
46
+ N = p.N; w = new T[N];
47
+ for (size_t i = 0; i <= N; i++) w[i] = p.w[i];
48
+ }
49
+ return *this;
50
+ }
51
+ // assignment grid size
52
+ poly& operator = (const T *a)
53
+ {
54
+ for(size_t i = 0; i < N; ++i) w[i] = a[i];
55
+ return *this;
56
+ }
57
+ // assignment unit size
58
+ poly& operator = (const T a)
59
+ {
60
+ w[N] = a;
61
+ return *this;
62
+ }
63
+ char *to_s(const char *f = "%g") const
64
+ {
65
+ str_buf c;
66
+ c += '<';
67
+ for (size_t i = 0; i <= N; i++) {
68
+ sprintg(c, w[i], f);
69
+ if (i < N) c += ',';
70
+ }
71
+ c += '>';
72
+ char *result = new char[c.size() + 1];
73
+ strcpy(result, c.c_str());
74
+ return result;
75
+ }
76
+ void fprint(FILE *f, const char *fmt = "%g\n") const { gprint(*this, f, fmt); }
77
+ void print(const char *fmt = "%g\n") const { this->fprint(stdout, fmt); }
78
+
79
+ }; // end of poly;
80
+
81
+ typedef unsigned short UTYPE;
82
+
83
+ const size_t _Z = 7;
84
+
85
+ template <> class poly<int>
86
+ {
87
+ UTYPE w[_Z+1];
88
+
89
+ public:
90
+
91
+ // default constructor
92
+ poly() { for (UTYPE &z : w) z = 0; }
93
+ // general constructor
94
+ poly(size_t n)
95
+ {
96
+ for (size_t i = 0; i < _Z; ++i) w[i] = 0;
97
+ w[_Z] = static_cast<UTYPE>(n);
98
+ }
99
+ template<class... Args>
100
+ poly(const int car, const Args... cdr)
101
+ {
102
+ size_t N = sizeof...(cdr);
103
+ assert(N < _Z);
104
+ w[0] = car; if (N > 0) poly_subst<UTYPE>(int(N-1), &w[1], cdr...);
105
+ w[_Z] = static_cast<UTYPE>(N);
106
+ }
107
+ poly(int n, int *s)
108
+ {
109
+ size_t N = n;
110
+ assert(N < _Z);
111
+ for (size_t i = 0; i < _Z; ++i)
112
+ w[i] = (i <= N) ? static_cast<UTYPE>(s[i]) : 0;
113
+ w[_Z] = static_cast<UTYPE>(N);
114
+ }
115
+ poly(int n, const int *s, int m)
116
+ {
117
+ size_t N = n;
118
+ assert(N < _Z);
119
+ for (size_t i = 0; i < _Z; ++i)
120
+ w[i] = (i < N) ? static_cast<UTYPE>(s[i]) : 0;
121
+ w[N] = m;
122
+ w[_Z] = static_cast<UTYPE>(N);
123
+ }
124
+ // default copy constructor
125
+ // default destructor
126
+ // assignment operator
127
+ poly& operator = (const poly& p)
128
+ {
129
+ if (this != &p) for (size_t i = 0; i <= _Z; ++i) w[i] = p.w[i];
130
+ return *this;
131
+ }
132
+ // assignment grid size
133
+ poly& operator = (const int *s)
134
+ {
135
+ size_t N = static_cast<size_t>(w[_Z]);
136
+ for (size_t i = 0; i < N; ++i)
137
+ w[i] = static_cast<UTYPE>(s[i]);
138
+ return *this;
139
+ }
140
+ // assignment unit size
141
+ poly& operator = (int t)
142
+ {
143
+ size_t N = static_cast<size_t>(w[_Z]);
144
+ w[N] = static_cast<UTYPE>(t);
145
+ return *this;
146
+ }
147
+ friend poly operator * (const poly& p, const poly& q)
148
+ {
149
+ size_t N = static_cast<size_t>(q.w[_Z]);
150
+ assert(q.w[_Z] == p.w[_Z]);
151
+ poly result(N);
152
+ for (size_t i=0;i<N;++i) result.w[i] = p.w[i] * q.w[i];
153
+ result.w[N] = p.w[N];
154
+ return result;
155
+ }
156
+ friend poly operator * (const poly& p, int a)
157
+ {
158
+ int N = static_cast<int>(p.w[_Z]);
159
+ poly result(N);
160
+ for (int i=0;i<N;++i) result.w[i] = p.w[i] * static_cast<UTYPE>(a);
161
+ result.w[N] = p.w[N];
162
+ return result;
163
+ }
164
+ friend poly operator * (int a, const poly& p)
165
+ {
166
+ return (p * a);
167
+ }
168
+ friend poly operator + (const poly& p, const poly& q)
169
+ {
170
+ assert(q.w[_Z] == p.w[_Z]);
171
+ size_t N = static_cast<size_t>(p.w[_Z]);
172
+ poly result(N);
173
+ for (size_t i=0;i<N;++i) result.w[i] = p.w[i] + q.w[i];
174
+ result.w[N] = p.w[N];
175
+ return result;
176
+ }
177
+ friend poly operator + (const poly& p, int a)
178
+ {
179
+ size_t N = static_cast<size_t>(p.w[_Z]);
180
+ poly result(N);
181
+ for (size_t i=0;i<N;++i) result.w[i] = p.w[i] + static_cast<UTYPE>(a);
182
+ result.w[N] = p.w[N];
183
+ return result;
184
+ }
185
+ friend poly operator + (int a, const poly& p)
186
+ {
187
+ return (p + a);
188
+ }
189
+ friend poly operator - (const poly& p, const poly& q)
190
+ {
191
+ assert(q.w[_Z] == p.w[_Z]);
192
+ size_t N = static_cast<size_t>(p.w[_Z]);
193
+ poly result(N);
194
+ for (size_t i=0;i<N;++i) result.w[i] = p.w[i] - q.w[i];
195
+ result.w[N] = p.w[N];
196
+ return result;
197
+ }
198
+ friend poly operator - (const poly& p, int a)
199
+ {
200
+ size_t N = static_cast<size_t>(p.w[_Z]);
201
+ poly result(N);
202
+ for (size_t i=0;i<N;++i) result.w[i] = p.w[i] - static_cast<UTYPE>(a);
203
+ result.w[N] = p.w[N];
204
+ return result;
205
+ }
206
+ friend poly operator - (int a, const poly& p)
207
+ {
208
+ size_t N = static_cast<size_t>(p.w[_Z]);
209
+ poly result(N);
210
+ for (size_t i=0;i<N;++i) result.w[i] = static_cast<UTYPE>(a) - p.w[i];
211
+ result.w[N] = p.w[N];
212
+ return result;
213
+ }
214
+ poly operator % (int a) const
215
+ {
216
+ size_t N = static_cast<size_t>(w[_Z]);
217
+ poly result(N);
218
+ for (size_t i=0;i<N;++i)
219
+ result.w[i] = w[i] % a;
220
+ result.w[N] = w[N];
221
+ return result;
222
+ }
223
+ poly& operator += (int a)
224
+ {
225
+ size_t N = static_cast<size_t>(w[_Z]);
226
+ for(size_t i=0;i<N;i++) w[i] += static_cast<UTYPE>(a);
227
+ return *this;
228
+ }
229
+ poly& operator -= (int a)
230
+ {
231
+ size_t N = static_cast<size_t>(w[_Z]);
232
+ for(size_t i=0;i<N;i++) w[i] -= static_cast<UTYPE>(a);
233
+ return *this;
234
+ }
235
+ bool operator == (const poly& p) const
236
+ {
237
+ size_t N = static_cast<size_t>(w[_Z]);
238
+ size_t i; for(i=0;i<=N;++i) if(w[i] != p.w[i]) break;
239
+ return i > N;
240
+ }
241
+ bool operator != (const poly& p) const
242
+ {
243
+ size_t N = static_cast<size_t>(w[_Z]);
244
+ size_t i; for(i=0;i<=N;i++) if(w[i] != p.w[i]) break;
245
+ return i <= N;
246
+ }
247
+ bool operator > (const poly& p) const
248
+ {
249
+ size_t N = static_cast<size_t>(w[_Z]);
250
+ assert(w[_Z] == p.w[_Z]);
251
+ size_t i; for(i=0;i<N;++i) if(w[i] <= p.w[i]) break;
252
+ return i == N && w[N] == p.w[N];
253
+ }
254
+ bool operator >= (const poly& p) const
255
+ {
256
+ size_t N = static_cast<size_t>(w[_Z]);
257
+ assert(w[_Z] == p.w[_Z]);
258
+ size_t i; for(i=0;i<N;++i) if(w[i] < p.w[i]) break;
259
+ return i == N && w[N] == p.w[N];
260
+ }
261
+ bool operator < (const poly& p) const
262
+ {
263
+ size_t N = static_cast<size_t>(w[_Z]);
264
+ assert(w[_Z] == p.w[_Z]);
265
+ size_t i; for(i=0;i<N;i++) if(w[i] >= p.w[i]) break;
266
+ return i == N && w[N] == p.w[N];
267
+ }
268
+ bool operator <= (const poly& p) const
269
+ {
270
+ size_t N = static_cast<size_t>(w[_Z]);
271
+ assert(w[_Z] == p.w[_Z]);
272
+ size_t i; for(i=0;i<N;i++) if(w[i] > p.w[i]) break;
273
+ return i == N && w[N] == p.w[N];
274
+ }
275
+ bool operator == (int a) const
276
+ {
277
+ size_t N = static_cast<size_t>(w[_Z]);
278
+ size_t i;
279
+ for (i = 0; i < N; ++i) if (w[i] != a) break;
280
+ return i == N;
281
+ }
282
+ bool operator != (int a) const
283
+ {
284
+ size_t N = static_cast<size_t>(w[_Z]);
285
+ size_t i;
286
+ for (i = 0; i < N; ++i) if (w[i] != a) break;
287
+ return i != N;
288
+ }
289
+ bool operator < (int a) const
290
+ {
291
+ size_t N = static_cast<size_t>(w[_Z]);
292
+ size_t i;
293
+ for (i = 0; i < N; ++i) if (w[i] >= a) break;
294
+ return i == N;
295
+ }
296
+ bool operator >= (int a) const
297
+ {
298
+ size_t N = static_cast<size_t>(w[_Z]);
299
+ size_t i;
300
+ for (i = 0; i < N; ++i) if (w[i] < a) break;
301
+ return i == N;
302
+ }
303
+ bool operator > (int a) const
304
+ {
305
+ size_t N = static_cast<size_t>(w[_Z]);
306
+ size_t i;
307
+ for (i = 0; i < N; ++i) if (w[i] <= a) break;
308
+ return i == N;
309
+ }
310
+ bool operator <= (int a) const
311
+ {
312
+ size_t N = static_cast<size_t>(w[_Z]);
313
+ size_t i;
314
+ for (i = 0; i < N; ++i) if (w[i] > a) break;
315
+ return i == N;
316
+ }
317
+ // member function
318
+ size_t length() const {return static_cast<size_t>(w[_Z]) + 1;}
319
+ size_t grid() const { return static_cast<size_t>(w[_Z]); }
320
+ size_t grid(size_t i) const { return static_cast<size_t>(w[i]); }
321
+ size_t atom() const { return grid(static_cast<size_t>(w[_Z])); }
322
+ size_t unit() const { return grid(static_cast<size_t>(w[_Z])-1); }
323
+ size_t line() const { return grid(static_cast<size_t>(w[_Z])-2); }
324
+ size_t plat() const { return grid(static_cast<size_t>(w[_Z])-3); }
325
+ size_t cube() const { return grid(static_cast<size_t>(w[_Z])-4); }
326
+ size_t grid_size(size_t n = 0) const
327
+ {
328
+ size_t N = static_cast<size_t>(w[_Z]);
329
+ assert(n <= N);
330
+ size_t z = 1;
331
+ for (size_t i = N - n; i > 0; --i) z *= static_cast<size_t>(w[i-1]);
332
+ return z;
333
+ }
334
+ size_t atom_size() const { return grid_size(0); }
335
+ size_t unit_size() const { return grid_size(1); }
336
+ size_t line_size() const { return grid_size(2); }
337
+ size_t plat_size() const { return grid_size(3); }
338
+ size_t cube_size() const { return grid_size(4); }
339
+ // w[n] * ... * w[N-1] * w[N]
340
+ size_t data_size(size_t n = 0) const
341
+ {
342
+ size_t N = static_cast<size_t>(w[_Z]);
343
+ size_t z = (n > N) ? 1 : (static_cast<size_t>(w[N]) + 1);
344
+ for(size_t i = N; i > n; --i) z *= static_cast<size_t>(w[i-1]);
345
+ return z;
346
+ }
347
+ // (w[m] + ... + w[n-1]) * w[N]
348
+ size_t comb_size(size_t n = 0) const
349
+ {
350
+ size_t N = static_cast<size_t>(w[_Z]);
351
+ assert(n < N);
352
+ size_t z = 0;
353
+ for(size_t i = N; i > n; --i) z += static_cast<size_t>(w[i-1]);
354
+ return z * (static_cast<size_t>(w[N]) + 1);
355
+ }
356
+ // (w[m] + ... + w[n-1]) * w[N-1] * w[N]
357
+ size_t cast_size(size_t n, size_t m = 0) const
358
+ {
359
+ size_t N = static_cast<size_t>(w[_Z]);
360
+ assert(0 < N && n < N && m <= n);
361
+ size_t z = 0;
362
+ for(size_t i = m; i < n; ++i) z += static_cast<size_t>(w[i]);
363
+ return z * data_size(N-1);
364
+ }
365
+ // w[0] + ... + w[N-1]
366
+ size_t band() const
367
+ {
368
+ size_t N = static_cast<size_t>(w[_Z]);
369
+ size_t z = 0;
370
+ for (size_t k = 0; k < N; ++k) z += static_cast<size_t>(w[k]);
371
+ return z;
372
+ }
373
+ size_t band_size(size_t i = 0) const
374
+ {
375
+ size_t N = static_cast<size_t>(w[_Z]);
376
+ assert(i <= N);
377
+ size_t z = 0;
378
+ for (size_t k = 0; k < i; ++k) z += static_cast<size_t>(w[k]);
379
+ return z * (static_cast<size_t>(w[N]) + 1);
380
+ }
381
+ // calculate Atom Position
382
+ size_t operator && (const poly& q) const
383
+ {
384
+ size_t N = static_cast<size_t>(w[_Z]);
385
+ size_t M = static_cast<size_t>(q.w[_Z]);
386
+ assert(N >= M);
387
+ size_t sum = static_cast<size_t>(q.w[M]) * data_size(M+1);
388
+ size_t sek = static_cast<size_t>(w[N]) + 1;
389
+ for (size_t i = N; i > 0; --i) {
390
+ if (i <= M)
391
+ sum += sek * static_cast<size_t>(q.w[i-1]);
392
+ sek *= static_cast<size_t>(w[i-1]);
393
+ }
394
+ return sum;
395
+ }
396
+ // Modular operation : Unit No. -> Poly Grid.
397
+ friend poly operator % (size_t a, const poly& q)
398
+ {
399
+ size_t N = static_cast<size_t>(q.w[_Z]);
400
+ poly p(N);
401
+ for (size_t i = N; i > 0; --i) {
402
+ size_t t = static_cast<size_t>(q.w[i-1]);
403
+ p.w[i-1] = static_cast<UTYPE>(a % t);
404
+ a /= t;
405
+ } p.w[N] = 0;
406
+ return p;
407
+ }
408
+ // Referrece of element.
409
+ int operator[] (int n) const { return static_cast<int>(w[n]); }
410
+ UTYPE& operator[] (int i) { return w[i]; }
411
+ poly operator<<(int i) const
412
+ {
413
+ size_t N = static_cast<int>(w[_Z]), M = N - i;
414
+ poly z(M);
415
+ for (size_t j = 0; j <= M; ++j) z.w[j] = w[static_cast<size_t>(i)+j];
416
+ return z;
417
+ }
418
+ poly operator>>(int i) const
419
+ {
420
+ size_t N = static_cast<int>(w[_Z]), M = N - i;
421
+ poly z(M);
422
+ size_t t = data_size(M);
423
+ for (size_t j = 0; j < M; ++j) z.w[j] = w[j];
424
+ z.w[M] = static_cast<UTYPE>(t);
425
+ return z;
426
+ }
427
+ char *to_s(const char *f = "%d") const
428
+ {
429
+ size_t N = static_cast<size_t>(w[_Z]);
430
+ str_buf c;
431
+ c += '<';
432
+ if (N > 0) {
433
+ c += '{';
434
+ for (size_t i = 0; i < N; i++) {
435
+ sprintg(c, (int)w[i], f);
436
+ if (i < N-1) c += ',';
437
+ }
438
+ c += "},";
439
+ } sprintg(c, (int)w[N], f);
440
+ c += '>';
441
+ char *result = new char[c.size() + 1];
442
+ strcpy(result, c.c_str());
443
+ return result;
444
+ }
445
+ void fprint(FILE *f, const char *fmt = "%d\n") const { gprint(*this, f, fmt); }
446
+ void print(const char *fmt = "%d\n") const { this->fprint(stdout, fmt); }
447
+
448
+ }; // end of poly<int>;
449
+
450
+ typedef poly<int> Int;
451
+
452
+ #include "basis/real.h"
453
+
454
+ #endif