gsl 1.16.0.6 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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);