gsl 1.16.0.6 → 2.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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -13
  3. data/ChangeLog +6 -0
  4. data/Gemfile +1 -0
  5. data/README.md +77 -1
  6. data/Rakefile +7 -1
  7. data/examples/linalg/QR_solve_narray.rb +2 -1
  8. data/examples/linalg/SV_narray.rb +10 -0
  9. data/examples/linalg/chol_narray.rb +3 -0
  10. data/examples/wavelet/wavelet1.rb +4 -2
  11. data/ext/gsl_native/array.c +10 -0
  12. data/ext/gsl_native/bspline.c +15 -2
  13. data/ext/gsl_native/cheb.c +76 -10
  14. data/ext/gsl_native/common.c +33 -0
  15. data/ext/gsl_native/dht.c +26 -0
  16. data/ext/gsl_native/eigen.c +129 -0
  17. data/ext/gsl_native/extconf.rb +60 -6
  18. data/ext/gsl_native/fft.c +42 -0
  19. data/ext/gsl_native/function.c +18 -0
  20. data/ext/gsl_native/gsl.c +5 -0
  21. data/ext/gsl_native/gsl_nmatrix.c +204 -0
  22. data/ext/gsl_native/histogram.c +42 -0
  23. data/ext/gsl_native/include/rb_gsl.h +4 -0
  24. data/ext/gsl_native/include/rb_gsl_array.h +4 -0
  25. data/ext/gsl_native/include/rb_gsl_common.h +5 -0
  26. data/ext/gsl_native/include/rb_gsl_interp.h +4 -0
  27. data/ext/gsl_native/include/rb_gsl_with_nmatrix.h +28 -0
  28. data/ext/gsl_native/interp.c +14 -0
  29. data/ext/gsl_native/linalg.c +414 -22
  30. data/ext/gsl_native/math.c +64 -0
  31. data/ext/gsl_native/multifit.c +61 -0
  32. data/ext/gsl_native/randist.c +42 -0
  33. data/ext/gsl_native/sf.c +6 -0
  34. data/ext/gsl_native/sf_ellint.c +4 -4
  35. data/ext/gsl_native/sf_mathieu.c +48 -0
  36. data/ext/gsl_native/spline.c +30 -0
  37. data/ext/gsl_native/tamu_anova.c +1 -1
  38. data/gsl.gemspec +8 -1
  39. data/lib/gsl.rb +5 -0
  40. data/lib/gsl/version.rb +1 -1
  41. data/rdoc/nmatrix.rdoc +129 -0
  42. data/rdoc/ref.rdoc +1 -0
  43. data/test.sh +21 -0
  44. data/test/gsl/bspline_test.rb +15 -14
  45. data/test/gsl/combination_test.rb +17 -6
  46. data/test/gsl/dht_test.rb +42 -33
  47. data/test/gsl/nmatrix_tests/nmatrix_cheb_test.rb +34 -0
  48. data/test/gsl/nmatrix_tests/nmatrix_eigen_test.rb +28 -0
  49. data/test/gsl/nmatrix_tests/nmatrix_gsl_test.rb +65 -0
  50. data/test/gsl/nmatrix_tests/nmatrix_interp_test.rb +45 -0
  51. data/test/gsl/nmatrix_tests/nmatrix_linalg_test.rb +100 -0
  52. data/test/gsl/nmatrix_tests/nmatrix_stats_test.rb +88 -0
  53. data/test/gsl/nmatrix_tests/nmatrix_wavelet_test.rb +5 -0
  54. data/test/gsl/randist_test.rb +43 -23
  55. data/test/test_helper.rb +30 -2
  56. metadata +191 -51
@@ -169,6 +169,21 @@ static VALUE rb_gsl_math_eval(double (*func)(const double), VALUE xx)
169
169
  return ary;
170
170
  }
171
171
  #endif
172
+
173
+ #ifdef HAVE_NMATRIX_H
174
+ if (NM_IsNMatrix(xx)) {
175
+ NM_DENSE_STORAGE *nm;
176
+ double *ptr1, *ptr2;
177
+ nm = NM_STORAGE_DENSE(xx);
178
+ size = NM_ELEMENTS_COUNT(xx);
179
+ ptr1 = (double*) nm->elements;
180
+ ary = rb_nmatrix_dense_create(FLOAT64, nm->shape, nm->dim, nm->elements,
181
+ size);
182
+ ptr2 = (double*)NM_DENSE_ELEMENTS(ary);
183
+ for (i = 0; i < size; i++) ptr2[i] = (*func)(ptr1[i]);
184
+ return ary;
185
+ }
186
+ #endif
172
187
  if (VECTOR_P(xx)) {
173
188
  return vector_eval_create(xx, func);
174
189
  } else if (MATRIX_P(xx)) {
@@ -230,6 +245,23 @@ static VALUE rb_gsl_math_eval2(double (*func)(const double, const double), VALUE
230
245
  return ary;
231
246
  }
232
247
  #endif
248
+
249
+ #ifdef HAVE_NMATRIX_H
250
+ if (NM_IsNMatrix(xx)) {
251
+ NM_DENSE_STORAGE *nmx, *nmy;
252
+ double *ptr1, *ptr2, *ptr3;
253
+ nmx = NM_STORAGE_DENSE(xx);
254
+ size = NM_ELEMENTS_COUNT(xx);
255
+ nmy = NM_STORAGE_DENSE(yy);
256
+ ptr1 = (double*) nmx->elements;
257
+ ptr2 = (double*) nmy->elements;
258
+ ary = rb_nmatrix_dense_create(FLOAT64, nmx->shape, nmx->dim, nmx->elements,
259
+ size);
260
+ ptr3 = (double*)NM_DENSE_ELEMENTS(ary);
261
+ for (i = 0; i < size; i++) ptr3[i] = (*func)(ptr1[i], ptr2[i]);
262
+ return ary;
263
+ }
264
+ #endif
233
265
  if (VECTOR_P(xx)) {
234
266
  CHECK_VECTOR(yy);
235
267
  Data_Get_Struct(xx, gsl_vector, v);
@@ -353,6 +385,21 @@ VALUE rb_gsl_pow(VALUE obj, VALUE xx, VALUE nn)
353
385
  for (i = 0; i < size; i++) ptr2[i] = pow(ptr1[i], n);
354
386
  return ary;
355
387
  }
388
+ #endif
389
+ #ifdef HAVE_NMATRIX_H
390
+ if (NM_IsNMatrix(xx)) {
391
+ NM_DENSE_STORAGE *nm;
392
+ double *ptr1, *ptr2;
393
+ n = NUM2DBL(nn);
394
+ nm = NM_STORAGE_DENSE(xx);
395
+ size = NM_ELEMENTS_COUNT(xx);
396
+ ptr1 = (double*) nm->elements;
397
+ ary = rb_nmatrix_dense_create(FLOAT64, nm->shape, nm->dim, nm->elements,
398
+ size);
399
+ ptr2 = (double*)NM_DENSE_ELEMENTS(ary);
400
+ for (i = 0; i < size; i++) ptr2[i] = pow(ptr1[i], n);
401
+ return ary;
402
+ }
356
403
  #endif
357
404
  if (VECTOR_P(xx)) {
358
405
  n = NUM2DBL(nn);
@@ -430,6 +477,23 @@ static VALUE rb_gsl_pow_int(VALUE obj, VALUE xx, VALUE nn)
430
477
  return ary;
431
478
  }
432
479
  #endif
480
+
481
+ #ifdef HAVE_NMATRIX_H
482
+ if (NM_IsNMatrix(xx)) {
483
+ NM_DENSE_STORAGE *nm;
484
+ double *ptr1, *ptr2;
485
+ CHECK_FIXNUM(nn);
486
+ n = FIX2INT(nn);
487
+ nm = NM_STORAGE_DENSE(xx);
488
+ size = NM_ELEMENTS_COUNT(xx);
489
+ ptr1 = (double*) nm->elements;
490
+ ary = rb_nmatrix_dense_create(FLOAT64, nm->shape, nm->dim, nm->elements,
491
+ size);
492
+ ptr2 = (double*)NM_DENSE_ELEMENTS(ary);
493
+ for (i = 0; i < size; i++) ptr2[i] = gsl_pow_int(ptr1[i], n);
494
+ return ary;
495
+ }
496
+ #endif
433
497
  if (VECTOR_P(xx)) {
434
498
  CHECK_FIXNUM(nn);
435
499
  n = FIX2INT(nn);
@@ -324,6 +324,9 @@ static VALUE rb_gsl_multifit_fdfsolver_test_gradient(int argc, VALUE *argv, VALU
324
324
  {
325
325
  gsl_multifit_fdfsolver *solver = NULL;
326
326
  gsl_vector *g = NULL;
327
+ #ifndef HAVE_GSL_MULTIFIT_FDFSOLVER_J
328
+ gsl_matrix *J = NULL;
329
+ #endif
327
330
  int status;
328
331
  double epsabs;
329
332
  Data_Get_Struct(obj, gsl_multifit_fdfsolver, solver);
@@ -331,7 +334,14 @@ static VALUE rb_gsl_multifit_fdfsolver_test_gradient(int argc, VALUE *argv, VALU
331
334
  case 1:
332
335
  Need_Float(argv[0]);
333
336
  g = gsl_vector_alloc(solver->x->size);
337
+ #ifdef HAVE_GSL_MULTIFIT_FDFSOLVER_J
334
338
  gsl_multifit_gradient(solver->J, solver->f, g);
339
+ #else
340
+ J = gsl_matrix_alloc(solver->f->size, solver->x->size);
341
+ gsl_multifit_fdfsolver_jac(solver, J);
342
+ gsl_multifit_gradient(J, solver->f, g);
343
+ gsl_matrix_free(J);
344
+ #endif
335
345
  epsabs = NUM2DBL(argv[0]);
336
346
  status = gsl_multifit_test_gradient(g, epsabs);
337
347
  gsl_vector_free(g);
@@ -353,15 +363,35 @@ static VALUE rb_gsl_multifit_fdfsolver_gradient(int argc, VALUE *argv, VALUE obj
353
363
  {
354
364
  gsl_multifit_fdfsolver *solver = NULL;
355
365
  gsl_vector *g = NULL;
366
+ #ifndef HAVE_GSL_MULTIFIT_FDFSOLVER_J
367
+ gsl_matrix *J = gsl_matrix_alloc(solver->f->size, solver->x->size);
368
+ #endif
356
369
  // local variable "status" declared and set, but never used
357
370
  //int status;
358
371
  Data_Get_Struct(obj, gsl_multifit_fdfsolver, solver);
372
+ #ifndef HAVE_GSL_MULTIFIT_FDFSOLVER_J
373
+ gsl_multifit_fdfsolver_jac(solver, J);
374
+ #endif
359
375
  if (argc == 1) {
376
+ #ifndef HAVE_GSL_MULTIFIT_FDFSOLVER_J
377
+ int retval = 0;
378
+ #endif
360
379
  Data_Get_Vector(argv[0], g);
380
+ #ifdef HAVE_GSL_MULTIFIT_FDFSOLVER_J
361
381
  return INT2FIX(gsl_multifit_gradient(solver->J, solver->f, g));
382
+ #else
383
+ retval = gsl_multifit_gradient(J, solver->f, g);
384
+ gsl_matrix_free(J);
385
+ return INT2FIX(retval);
386
+ #endif
362
387
  } else {
363
388
  g = gsl_vector_alloc(solver->x->size);
389
+ #ifdef HAVE_GSL_MULTIFIT_FDFSOLVER_J
364
390
  /*status =*/ gsl_multifit_gradient(solver->J, solver->f, g);
391
+ #else
392
+ /*status =*/ gsl_multifit_gradient(J, solver->f, g);
393
+ gsl_matrix_free(J);
394
+ #endif
365
395
  return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, g);
366
396
  }
367
397
  }
@@ -377,15 +407,33 @@ static VALUE rb_gsl_multifit_fdfsolver_covar(int argc, VALUE *argv, VALUE obj)
377
407
  Need_Float(argv[0]);
378
408
  Data_Get_Struct(obj, gsl_multifit_fdfsolver, solver);
379
409
  epsrel = NUM2DBL(argv[0]);
410
+ #ifndef HAVE_GSL_MULTIFIT_FDFSOLVER_J
411
+ gsl_matrix *J = gsl_matrix_alloc(solver->f->size, solver->x->size);
412
+ gsl_multifit_fdfsolver_jac(solver, J);
413
+ #endif
380
414
  switch (argc) {
415
+ #ifndef HAVE_GSL_MULTIFIT_FDFSOLVER_J
416
+ int retval = 0;
417
+ #endif
381
418
  case 1:
382
419
  covar = gsl_matrix_alloc(solver->x->size, solver->x->size);
420
+ #ifdef HAVE_GSL_MULTIFIT_FDFSOLVER_J
383
421
  /*status =*/ gsl_multifit_covar(solver->J, epsrel, covar);
422
+ #else
423
+ /*status =*/ gsl_multifit_covar(J, epsrel, covar);
424
+ gsl_matrix_free(J);
425
+ #endif
384
426
  return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, covar);
385
427
  break;
386
428
  case 2:
387
429
  Data_Get_Matrix(argv[1], covar);
430
+ #ifdef HAVE_GSL_MULTIFIT_FDFSOLVER_J
388
431
  return INT2FIX(gsl_multifit_covar(solver->J, epsrel, covar));
432
+ #else
433
+ retval = gsl_multifit_covar(J, epsrel, covar);
434
+ gsl_matrix_free(J);
435
+ return INT2FIX(retval);
436
+ #endif
389
437
  break;
390
438
  default:
391
439
  rb_raise(rb_eArgError, "wrong number of arguments");
@@ -418,7 +466,13 @@ static VALUE rb_gsl_multifit_fdfsolver_J(VALUE obj)
418
466
  {
419
467
  gsl_multifit_fdfsolver *solver = NULL;
420
468
  Data_Get_Struct(obj, gsl_multifit_fdfsolver, solver);
469
+ #ifdef HAVE_GSL_MULTIFIT_FDFSOLVER_J
421
470
  return Data_Wrap_Struct(cgsl_matrix_view_ro, 0, NULL, solver->J);
471
+ #else
472
+ gsl_matrix *J = gsl_matrix_alloc(solver->f->size, solver->x->size);
473
+ gsl_multifit_fdfsolver_jac(solver, J);
474
+ return Data_Wrap_Struct(cgsl_matrix_view_ro, 0, gsl_matrix_free, J);
475
+ #endif
422
476
  }
423
477
 
424
478
  /* singleton */
@@ -1699,7 +1753,14 @@ static VALUE rb_gsl_multifit_fit(int argc, VALUE *argv, VALUE klass)
1699
1753
  covar = gsl_matrix_alloc(p, p);
1700
1754
  chi2 = gsl_pow_2(gsl_blas_dnrm2(solver->f)); /* not reduced chi-square */
1701
1755
  dof = n - p;
1756
+ #ifdef HAVE_GSL_MULTIFIT_FDFSOLVER_J
1702
1757
  gsl_multifit_covar(solver->J, 0.0, covar);
1758
+ #else
1759
+ gsl_matrix *J = gsl_matrix_alloc(n,p);
1760
+ gsl_multifit_fdfsolver_jac(solver, J);
1761
+ gsl_multifit_covar(J, 0.0, covar);
1762
+ gsl_matrix_free(J);
1763
+ #endif
1703
1764
  for (i = 0; i < p; i++)
1704
1765
  gsl_vector_set(verr, i, sqrt(chi2/dof*gsl_matrix_get(covar, i, i)));
1705
1766
  gsl_matrix_free(covar);
@@ -1316,6 +1316,20 @@ VALUE rb_gsl_eval_pdf_cdf(VALUE xx, double (*f)(double))
1316
1316
  return ary;
1317
1317
  }
1318
1318
  #endif
1319
+
1320
+ #ifdef HAVE_NMATRIX_H
1321
+ if (NM_IsNMatrix(xx)) {
1322
+ NM_DENSE_STORAGE *nm;
1323
+ double *ptr1, *ptr2;
1324
+ nm = NM_STORAGE_DENSE(xx);
1325
+ n = NM_DENSE_COUNT(xx);
1326
+ ptr1 = (double *) nm->elements;
1327
+ ary = rb_nmatrix_dense_create(FLOAT64, nm->shape, nm->dim, nm->elements, n);
1328
+ ptr2 = (double*)NM_DENSE_ELEMENTS(ary);
1329
+ for (i = 0; i < n; i++) ptr2[i] = (*f)(ptr1[i]);
1330
+ return ary;
1331
+ }
1332
+ #endif
1319
1333
  if (VECTOR_P(xx)) {
1320
1334
  Data_Get_Struct(xx, gsl_vector, v);
1321
1335
  vnew = gsl_vector_alloc(v->size);
@@ -1384,6 +1398,20 @@ VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa,
1384
1398
  return ary;
1385
1399
  }
1386
1400
  #endif
1401
+
1402
+ #ifdef HAVE_NMATRIX_H
1403
+ if (NM_IsNMatrix(xx)) {
1404
+ NM_DENSE_STORAGE *nm;
1405
+ double *ptr1, *ptr2;
1406
+ nm = NM_STORAGE_DENSE(xx);
1407
+ n = NM_DENSE_COUNT(xx);
1408
+ ptr1 = (double*) nm->elements;
1409
+ ary = rb_nmatrix_dense_create(FLOAT64, nm->shape, nm->dim, nm->elements, n);
1410
+ ptr2 = (double*)NM_DENSE_ELEMENTS(ary);
1411
+ for (i = 0; i < n; i++) ptr2[i] = (*f)(ptr1[i], a);
1412
+ return ary;
1413
+ }
1414
+ #endif
1387
1415
  if (VECTOR_P(xx)) {
1388
1416
  Data_Get_Struct(xx, gsl_vector, v);
1389
1417
  vnew = gsl_vector_alloc(v->size);
@@ -1452,6 +1480,20 @@ VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb,
1452
1480
  return ary;
1453
1481
  }
1454
1482
  #endif
1483
+
1484
+ #ifdef HAVE_NMATRIX_H
1485
+ if (NM_IsNMatrix(xx)) {
1486
+ NM_DENSE_STORAGE *nm;
1487
+ double *ptr1, *ptr2;
1488
+ nm = NM_STORAGE_DENSE(xx);
1489
+ n = NM_DENSE_COUNT(xx);
1490
+ ptr1 = (double *) nm->elements;
1491
+ ary = rb_nmatrix_dense_create(FLOAT64, nm->shape, nm->dim, nm->elements, n);
1492
+ ptr2 = (double*) NM_DENSE_ELEMENTS(ary);
1493
+ for (i = 0; i < n; i++) ptr2[i] = (*f)(ptr1[i], a, b);
1494
+ return ary;
1495
+ }
1496
+ #endif
1455
1497
  if (VECTOR_P(xx)) {
1456
1498
  Data_Get_Struct(xx, gsl_vector, v);
1457
1499
  vnew = gsl_vector_alloc(v->size);
@@ -131,6 +131,12 @@ VALUE rb_gsl_sf_eval1(double (*func)(double), VALUE argv)
131
131
  return rb_gsl_nary_eval1(argv, func);
132
132
  }
133
133
  #endif
134
+
135
+ #ifdef HAVE_NMATRIX_H
136
+ if (NM_IsNMatrix(argv)) {
137
+ return rb_gsl_nmatrix_eval1(argv, func);
138
+ }
139
+ #endif
134
140
  if (MATRIX_P(argv)) {
135
141
  return matrix_eval_create(argv, func);
136
142
  } else if (VECTOR_P(argv)) {
@@ -82,17 +82,17 @@ static VALUE rb_gsl_sf_ellint_P_e(VALUE obj, VALUE phi, VALUE k,
82
82
  static VALUE rb_gsl_sf_ellint_D(int argc, VALUE *argv, VALUE obj)
83
83
  {
84
84
  if (argc == 3)
85
- return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_D, argv[0], argv[1], argv[2],
85
+ return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_D, argv[0], argv[1],
86
86
  INT2FIX(GSL_PREC_DOUBLE));
87
87
  else
88
- return rb_gsl_sf_eval_double3_m(gsl_sf_ellint_D, argv[0], argv[1], argv[2],
88
+ return rb_gsl_sf_eval_double2_m(gsl_sf_ellint_D, argv[0], argv[1],
89
89
  argv[3]);
90
90
  }
91
91
 
92
92
  static VALUE rb_gsl_sf_ellint_D_e(VALUE obj, VALUE phi, VALUE k,
93
- VALUE n, VALUE m)
93
+ VALUE m)
94
94
  {
95
- return rb_gsl_sf_eval_e_double3_m(gsl_sf_ellint_D_e, phi, k, n, m);
95
+ return rb_gsl_sf_eval_e_double2_m(gsl_sf_ellint_D_e, phi, k, m);
96
96
  }
97
97
 
98
98
  static VALUE rb_gsl_sf_ellint_RC(int argc, VALUE *argv, VALUE obj)
@@ -133,11 +133,19 @@ static VALUE sf_mathieu_eval_e_int2_double2(VALUE n1, VALUE n2, VALUE qq, VALUE
133
133
  /**********/
134
134
  static VALUE rb_gsl_sf_mathieu_a_e(VALUE module, VALUE order, VALUE qq)
135
135
  {
136
+ #ifdef HAVE_GSL_SF_MATHIEU_A_E
137
+ return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_a_e, order, qq);
138
+ #else
136
139
  return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_a, order, qq);
140
+ #endif
137
141
  }
138
142
  static VALUE rb_gsl_sf_mathieu_a(VALUE module, VALUE order, VALUE qq)
139
143
  {
144
+ #ifdef HAVE_GSL_SF_MATHIEU_A_E
145
+ return sf_mathieu_eval(order, qq, gsl_sf_mathieu_a_e);
146
+ #else
140
147
  return sf_mathieu_eval(order, qq, gsl_sf_mathieu_a);
148
+ #endif
141
149
  }
142
150
  static VALUE rb_gsl_sf_mathieu_a_array(VALUE module, int argc, VALUE *argv)
143
151
  {
@@ -145,11 +153,19 @@ static VALUE rb_gsl_sf_mathieu_a_array(VALUE module, int argc, VALUE *argv)
145
153
  }
146
154
  static VALUE rb_gsl_sf_mathieu_b_e(VALUE module, VALUE order, VALUE qq)
147
155
  {
156
+ #ifdef HAVE_GSL_SF_MATHIEU_B_E
157
+ return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_b_e, order, qq);
158
+ #else
148
159
  return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_b, order, qq);
160
+ #endif
149
161
  }
150
162
  static VALUE rb_gsl_sf_mathieu_b(VALUE module, VALUE order, VALUE qq)
151
163
  {
164
+ #ifdef HAVE_GSL_SF_MATHIEU_B_E
165
+ return sf_mathieu_eval(order, qq, gsl_sf_mathieu_b_e);
166
+ #else
152
167
  return sf_mathieu_eval(order, qq, gsl_sf_mathieu_b);
168
+ #endif
153
169
  }
154
170
  static VALUE rb_gsl_sf_mathieu_b_array(VALUE module, int argc, VALUE *argv)
155
171
  {
@@ -157,11 +173,19 @@ static VALUE rb_gsl_sf_mathieu_b_array(VALUE module, int argc, VALUE *argv)
157
173
  }
158
174
  static VALUE rb_gsl_sf_mathieu_ce_e(VALUE module, VALUE order, VALUE qq, VALUE zz)
159
175
  {
176
+ #ifdef HAVE_GSL_SF_MATHIEU_CE_E
177
+ return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_ce_e);
178
+ #else
160
179
  return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_ce);
180
+ #endif
161
181
  }
162
182
  static VALUE rb_gsl_sf_mathieu_ce(VALUE module, VALUE order, VALUE qq, VALUE zz)
163
183
  {
184
+ #ifdef HAVE_GSL_SF_MATHIEU_CE_E
185
+ return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_ce_e);
186
+ #else
164
187
  return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_ce);
188
+ #endif
165
189
  }
166
190
  static VALUE rb_gsl_sf_mathieu_ce_array(VALUE module, int argc, VALUE *argv)
167
191
  {
@@ -169,11 +193,19 @@ static VALUE rb_gsl_sf_mathieu_ce_array(VALUE module, int argc, VALUE *argv)
169
193
  }
170
194
  static VALUE rb_gsl_sf_mathieu_se_e(VALUE module, VALUE order, VALUE qq, VALUE zz)
171
195
  {
196
+ #ifdef HAVE_GSL_SF_MATHIEU_SE_E
197
+ return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_se_e);
198
+ #else
172
199
  return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_se);
200
+ #endif
173
201
  }
174
202
  static VALUE rb_gsl_sf_mathieu_se(VALUE module, VALUE order, VALUE qq, VALUE zz)
175
203
  {
204
+ #ifdef HAVE_GSL_SF_MATHIEU_SE_E
205
+ return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_se_e);
206
+ #else
176
207
  return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_se);
208
+ #endif
177
209
  }
178
210
  static VALUE rb_gsl_sf_mathieu_se_array(VALUE module, int argc, VALUE *argv)
179
211
  {
@@ -183,11 +215,19 @@ static VALUE rb_gsl_sf_mathieu_se_array(VALUE module, int argc, VALUE *argv)
183
215
  /*****/
184
216
  static VALUE rb_gsl_sf_mathieu_Mc_e(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
185
217
  {
218
+ #ifdef HAVE_GSL_SF_MATHIEU_MC_E
219
+ return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Mc_e);
220
+ #else
186
221
  return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Mc);
222
+ #endif
187
223
  }
188
224
  static VALUE rb_gsl_sf_mathieu_Mc(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
189
225
  {
226
+ #ifdef HAVE_GSL_SF_MATHIEU_MC_E
227
+ return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Mc_e);
228
+ #else
190
229
  return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Mc);
230
+ #endif
191
231
  }
192
232
  static VALUE rb_gsl_sf_mathieu_Mc_array(VALUE module, int argc, VALUE *argv)
193
233
  {
@@ -195,11 +235,19 @@ static VALUE rb_gsl_sf_mathieu_Mc_array(VALUE module, int argc, VALUE *argv)
195
235
  }
196
236
  static VALUE rb_gsl_sf_mathieu_Ms_e(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
197
237
  {
238
+ #ifdef HAVE_GSL_SF_MATHIEU_MS_E
239
+ return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Ms_e);
240
+ #else
198
241
  return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Ms);
242
+ #endif
199
243
  }
200
244
  static VALUE rb_gsl_sf_mathieu_Ms(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
201
245
  {
246
+ #ifdef HAVE_GSL_SF_MATHIEU_MS_E
247
+ return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Ms_e);
248
+ #else
202
249
  return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Ms);
250
+ #endif
203
251
  }
204
252
  static VALUE rb_gsl_sf_mathieu_Ms_array(VALUE module, int argc, VALUE *argv)
205
253
  {
@@ -85,6 +85,14 @@ static VALUE rb_gsl_spline_init(VALUE obj, VALUE xxa, VALUE yya)
85
85
  size = nax->total;
86
86
  ptr1 = (double *) nax->ptr;
87
87
  #endif
88
+ #ifdef HAVE_NARRAY_H
89
+ } else if (NM_IsNMatrix(xxa)) {
90
+ NM_DENSE_STORAGE *nmx = NULL;
91
+ nmx = NM_STORAGE_DENSE(xxa);
92
+ size = NM_DENSE_COUNT(xxa);
93
+ ptr1 = (double *) nmx->elements;
94
+ #endif
95
+
88
96
  } else {
89
97
  rb_raise(rb_eTypeError, "not a vector");
90
98
  }
@@ -99,6 +107,13 @@ static VALUE rb_gsl_spline_init(VALUE obj, VALUE xxa, VALUE yya)
99
107
  GetNArray(yya, nay);
100
108
  ptr2 = (double *) nay->ptr;
101
109
  #endif
110
+
111
+ #ifdef HAVE_NARRAY_H
112
+ } else if (NM_IsNMatrix(yya)) {
113
+ NM_DENSE_STORAGE *nmy;
114
+ nmy = NM_STORAGE_DENSE(yya);
115
+ ptr2 = (double *) nmy->elements;
116
+ #endif
102
117
  } else if (VECTOR_P(yya)) {
103
118
  Data_Get_Struct(yya, gsl_vector, ya);
104
119
  ptr2 = ya->data;
@@ -162,6 +177,21 @@ static VALUE rb_gsl_spline_evaluate(VALUE obj, VALUE xx,
162
177
  return ary;
163
178
  }
164
179
  #endif
180
+
181
+ #ifdef HAVE_NMATRIX_H
182
+ if (NM_IsNMatrix(xx)) {
183
+ double *ptr1 = NULL, *ptr2 = NULL;
184
+ NM_DENSE_STORAGE *nm = NULL;
185
+ nm = NM_STORAGE_DENSE(xx);
186
+ n = NM_DENSE_COUNT(xx);
187
+ ptr1 = (double *) nm->elements;
188
+ ary = rb_nmatrix_dense_create(FLOAT64, nm->shape, nm->dim, nm->elements, n);
189
+ ptr2 = (double*)NM_DENSE_ELEMENTS(ary);
190
+ for (i = 0; i < n; i++)
191
+ ptr2[i] = (*eval)(rgs->s, ptr1[i], rgs->a);
192
+ return ary;
193
+ }
194
+ #endif
165
195
  if (VECTOR_P(xx)) {
166
196
  Data_Get_Struct(xx, gsl_vector, v);
167
197
  vnew = gsl_vector_alloc(v->size);