rb-gsl 1.16.0.5 → 1.16.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (612) hide show
  1. checksums.yaml +4 -4
  2. data/rb-gsl.gemspec +5 -10
  3. metadata +10 -713
  4. data/.gitignore +0 -12
  5. data/.travis.yml +0 -24
  6. data/AUTHORS +0 -12
  7. data/COPYING +0 -341
  8. data/ChangeLog +0 -621
  9. data/Gemfile +0 -4
  10. data/README.md +0 -77
  11. data/Rakefile +0 -20
  12. data/THANKS +0 -17
  13. data/examples/alf/alf.gp +0 -15
  14. data/examples/alf/alf.rb +0 -32
  15. data/examples/blas/blas.rb +0 -13
  16. data/examples/blas/dnrm2.rb +0 -16
  17. data/examples/blas/level1.rb +0 -81
  18. data/examples/blas/level2.rb +0 -11
  19. data/examples/blas/level3.rb +0 -12
  20. data/examples/bspline.rb +0 -57
  21. data/examples/cdf.rb +0 -16
  22. data/examples/cheb.rb +0 -21
  23. data/examples/combination.rb +0 -23
  24. data/examples/complex/RC-lpf.rb +0 -47
  25. data/examples/complex/add.rb +0 -36
  26. data/examples/complex/coerce.rb +0 -14
  27. data/examples/complex/complex.rb +0 -25
  28. data/examples/complex/fpmi.rb +0 -70
  29. data/examples/complex/functions.rb +0 -77
  30. data/examples/complex/michelson.rb +0 -36
  31. data/examples/complex/mul.rb +0 -28
  32. data/examples/complex/oscillator.rb +0 -17
  33. data/examples/complex/set.rb +0 -37
  34. data/examples/const/physconst.rb +0 -151
  35. data/examples/const/travel.rb +0 -45
  36. data/examples/deriv/demo.rb +0 -13
  37. data/examples/deriv/deriv.rb +0 -36
  38. data/examples/deriv/diff.rb +0 -35
  39. data/examples/dht.rb +0 -42
  40. data/examples/dirac.rb +0 -56
  41. data/examples/eigen/eigen.rb +0 -34
  42. data/examples/eigen/herm.rb +0 -22
  43. data/examples/eigen/narray.rb +0 -9
  44. data/examples/eigen/nonsymm.rb +0 -37
  45. data/examples/eigen/nonsymmv.rb +0 -43
  46. data/examples/eigen/qhoscillator.gp +0 -35
  47. data/examples/eigen/qhoscillator.rb +0 -90
  48. data/examples/eigen/vander.rb +0 -41
  49. data/examples/fft/fft.rb +0 -17
  50. data/examples/fft/fft2.rb +0 -17
  51. data/examples/fft/forward.rb +0 -25
  52. data/examples/fft/forward2.rb +0 -26
  53. data/examples/fft/radix2.rb +0 -18
  54. data/examples/fft/real-halfcomplex.rb +0 -33
  55. data/examples/fft/real-halfcomplex2.rb +0 -30
  56. data/examples/fft/realradix2.rb +0 -19
  57. data/examples/fft/sunspot.dat +0 -256
  58. data/examples/fft/sunspot.rb +0 -16
  59. data/examples/fit/expdata.dat +0 -20
  60. data/examples/fit/expfit.rb +0 -31
  61. data/examples/fit/gaussfit.rb +0 -29
  62. data/examples/fit/gaussian_2peaks.rb +0 -34
  63. data/examples/fit/hillfit.rb +0 -40
  64. data/examples/fit/lognormal.rb +0 -26
  65. data/examples/fit/lorentzfit.rb +0 -22
  66. data/examples/fit/multifit.rb +0 -72
  67. data/examples/fit/ndlinear.rb +0 -133
  68. data/examples/fit/nonlinearfit.rb +0 -89
  69. data/examples/fit/plot.gp +0 -36
  70. data/examples/fit/polyfit.rb +0 -9
  71. data/examples/fit/powerfit.rb +0 -21
  72. data/examples/fit/sigmoidfit.rb +0 -40
  73. data/examples/fit/sinfit.rb +0 -22
  74. data/examples/fit/wlinear.rb +0 -46
  75. data/examples/fresnel.rb +0 -11
  76. data/examples/function/function.rb +0 -36
  77. data/examples/function/log.rb +0 -7
  78. data/examples/function/min.rb +0 -33
  79. data/examples/function/sin.rb +0 -10
  80. data/examples/function/synchrotron.rb +0 -18
  81. data/examples/gallery/butterfly.rb +0 -7
  82. data/examples/gallery/cayley.rb +0 -12
  83. data/examples/gallery/cornu.rb +0 -23
  84. data/examples/gallery/eight.rb +0 -11
  85. data/examples/gallery/koch.rb +0 -40
  86. data/examples/gallery/lemniscate.rb +0 -11
  87. data/examples/gallery/polar.rb +0 -11
  88. data/examples/gallery/rgplot/cossin.rb +0 -35
  89. data/examples/gallery/rgplot/rgplot.replaced +0 -0
  90. data/examples/gallery/rgplot/roesller.rb +0 -55
  91. data/examples/gallery/roesller.rb +0 -39
  92. data/examples/gallery/scarabaeus.rb +0 -14
  93. data/examples/histogram/cauchy.rb +0 -27
  94. data/examples/histogram/cauchy.sh +0 -2
  95. data/examples/histogram/exponential.rb +0 -19
  96. data/examples/histogram/gauss.rb +0 -16
  97. data/examples/histogram/gsl-histogram.rb +0 -40
  98. data/examples/histogram/histo2d.rb +0 -31
  99. data/examples/histogram/histo3d.rb +0 -34
  100. data/examples/histogram/histogram-pdf.rb +0 -27
  101. data/examples/histogram/histogram.rb +0 -26
  102. data/examples/histogram/integral.rb +0 -28
  103. data/examples/histogram/poisson.rb +0 -27
  104. data/examples/histogram/power.rb +0 -25
  105. data/examples/histogram/rebin.rb +0 -17
  106. data/examples/histogram/smp.dat +0 -5
  107. data/examples/histogram/xexp.rb +0 -21
  108. data/examples/integration/ahmed.rb +0 -21
  109. data/examples/integration/cosmology.rb +0 -75
  110. data/examples/integration/friedmann.gp +0 -16
  111. data/examples/integration/friedmann.rb +0 -35
  112. data/examples/integration/gamma-zeta.rb +0 -35
  113. data/examples/integration/integration.rb +0 -22
  114. data/examples/integration/qag.rb +0 -8
  115. data/examples/integration/qag2.rb +0 -14
  116. data/examples/integration/qag3.rb +0 -8
  117. data/examples/integration/qagi.rb +0 -28
  118. data/examples/integration/qagi2.rb +0 -49
  119. data/examples/integration/qagiu.rb +0 -29
  120. data/examples/integration/qagp.rb +0 -20
  121. data/examples/integration/qags.rb +0 -14
  122. data/examples/integration/qawc.rb +0 -18
  123. data/examples/integration/qawf.rb +0 -41
  124. data/examples/integration/qawo.rb +0 -29
  125. data/examples/integration/qaws.rb +0 -30
  126. data/examples/integration/qng.rb +0 -17
  127. data/examples/interp/demo.gp +0 -20
  128. data/examples/interp/demo.rb +0 -45
  129. data/examples/interp/interp.rb +0 -37
  130. data/examples/interp/points +0 -10
  131. data/examples/interp/spline.rb +0 -20
  132. data/examples/jacobi/deriv.rb +0 -40
  133. data/examples/jacobi/integrate.rb +0 -34
  134. data/examples/jacobi/interp.rb +0 -43
  135. data/examples/jacobi/jacobi.rb +0 -11
  136. data/examples/linalg/HH.rb +0 -15
  137. data/examples/linalg/HH_narray.rb +0 -13
  138. data/examples/linalg/LQ_solve.rb +0 -73
  139. data/examples/linalg/LU.rb +0 -84
  140. data/examples/linalg/LU2.rb +0 -31
  141. data/examples/linalg/LU_narray.rb +0 -24
  142. data/examples/linalg/PTLQ.rb +0 -47
  143. data/examples/linalg/QR.rb +0 -18
  144. data/examples/linalg/QRPT.rb +0 -47
  145. data/examples/linalg/QR_solve.rb +0 -78
  146. data/examples/linalg/QR_solve_narray.rb +0 -13
  147. data/examples/linalg/SV.rb +0 -16
  148. data/examples/linalg/SV_narray.rb +0 -12
  149. data/examples/linalg/SV_solve.rb +0 -49
  150. data/examples/linalg/chol.rb +0 -29
  151. data/examples/linalg/chol_narray.rb +0 -15
  152. data/examples/linalg/complex.rb +0 -57
  153. data/examples/linalg/invert_narray.rb +0 -10
  154. data/examples/math/const.rb +0 -67
  155. data/examples/math/elementary.rb +0 -35
  156. data/examples/math/functions.rb +0 -41
  157. data/examples/math/inf_nan.rb +0 -34
  158. data/examples/math/minmax.rb +0 -22
  159. data/examples/math/power.rb +0 -18
  160. data/examples/math/test.rb +0 -31
  161. data/examples/matrix/a.dat +0 -0
  162. data/examples/matrix/add.rb +0 -45
  163. data/examples/matrix/b.dat +0 -4
  164. data/examples/matrix/cat.rb +0 -31
  165. data/examples/matrix/colvectors.rb +0 -24
  166. data/examples/matrix/complex.rb +0 -41
  167. data/examples/matrix/det.rb +0 -29
  168. data/examples/matrix/diagonal.rb +0 -23
  169. data/examples/matrix/get_all.rb +0 -159
  170. data/examples/matrix/hilbert.rb +0 -31
  171. data/examples/matrix/iterator.rb +0 -19
  172. data/examples/matrix/matrix.rb +0 -57
  173. data/examples/matrix/minmax.rb +0 -53
  174. data/examples/matrix/mul.rb +0 -39
  175. data/examples/matrix/rand.rb +0 -20
  176. data/examples/matrix/read.rb +0 -29
  177. data/examples/matrix/rowcol.rb +0 -47
  178. data/examples/matrix/set.rb +0 -41
  179. data/examples/matrix/set_all.rb +0 -100
  180. data/examples/matrix/view.rb +0 -32
  181. data/examples/matrix/view_all.rb +0 -148
  182. data/examples/matrix/write.rb +0 -23
  183. data/examples/min.rb +0 -29
  184. data/examples/monte/miser.rb +0 -47
  185. data/examples/monte/monte.rb +0 -47
  186. data/examples/monte/plain.rb +0 -47
  187. data/examples/monte/vegas.rb +0 -46
  188. data/examples/multimin/bundle.rb +0 -66
  189. data/examples/multimin/cqp.rb +0 -109
  190. data/examples/multimin/fdfminimizer.rb +0 -40
  191. data/examples/multimin/fminimizer.rb +0 -41
  192. data/examples/multiroot/demo.rb +0 -36
  193. data/examples/multiroot/fdfsolver.rb +0 -50
  194. data/examples/multiroot/fsolver.rb +0 -33
  195. data/examples/multiroot/fsolver2.rb +0 -32
  196. data/examples/multiroot/fsolver3.rb +0 -26
  197. data/examples/narray/histogram.rb +0 -14
  198. data/examples/narray/mandel.rb +0 -27
  199. data/examples/narray/narray.rb +0 -28
  200. data/examples/narray/narray2.rb +0 -44
  201. data/examples/narray/sf.rb +0 -26
  202. data/examples/ntuple/create.rb +0 -17
  203. data/examples/ntuple/project.rb +0 -31
  204. data/examples/odeiv/binarysystem.gp +0 -23
  205. data/examples/odeiv/binarysystem.rb +0 -104
  206. data/examples/odeiv/demo.gp +0 -24
  207. data/examples/odeiv/demo.rb +0 -69
  208. data/examples/odeiv/demo2.gp +0 -26
  209. data/examples/odeiv/duffing.rb +0 -45
  210. data/examples/odeiv/frei1.rb +0 -109
  211. data/examples/odeiv/frei2.rb +0 -76
  212. data/examples/odeiv/legendre.rb +0 -52
  213. data/examples/odeiv/odeiv.rb +0 -32
  214. data/examples/odeiv/odeiv2.rb +0 -45
  215. data/examples/odeiv/oscillator.rb +0 -42
  216. data/examples/odeiv/sedov.rb +0 -97
  217. data/examples/odeiv/whitedwarf.gp +0 -40
  218. data/examples/odeiv/whitedwarf.rb +0 -158
  219. data/examples/ool/conmin.rb +0 -100
  220. data/examples/ool/gencan.rb +0 -99
  221. data/examples/ool/pgrad.rb +0 -100
  222. data/examples/ool/spg.rb +0 -100
  223. data/examples/pdf/bernoulli.rb +0 -5
  224. data/examples/pdf/beta.rb +0 -7
  225. data/examples/pdf/binomiral.rb +0 -10
  226. data/examples/pdf/cauchy.rb +0 -6
  227. data/examples/pdf/chisq.rb +0 -8
  228. data/examples/pdf/exponential.rb +0 -7
  229. data/examples/pdf/exppow.rb +0 -6
  230. data/examples/pdf/fdist.rb +0 -7
  231. data/examples/pdf/flat.rb +0 -7
  232. data/examples/pdf/gamma.rb +0 -8
  233. data/examples/pdf/gauss-tail.rb +0 -5
  234. data/examples/pdf/gauss.rb +0 -6
  235. data/examples/pdf/geometric.rb +0 -5
  236. data/examples/pdf/gumbel.rb +0 -6
  237. data/examples/pdf/hypergeometric.rb +0 -11
  238. data/examples/pdf/landau.rb +0 -5
  239. data/examples/pdf/laplace.rb +0 -7
  240. data/examples/pdf/logarithmic.rb +0 -5
  241. data/examples/pdf/logistic.rb +0 -6
  242. data/examples/pdf/lognormal.rb +0 -6
  243. data/examples/pdf/neg-binomiral.rb +0 -10
  244. data/examples/pdf/pareto.rb +0 -7
  245. data/examples/pdf/pascal.rb +0 -10
  246. data/examples/pdf/poisson.rb +0 -5
  247. data/examples/pdf/rayleigh-tail.rb +0 -6
  248. data/examples/pdf/rayleigh.rb +0 -6
  249. data/examples/pdf/tdist.rb +0 -6
  250. data/examples/pdf/weibull.rb +0 -8
  251. data/examples/permutation/ex1.rb +0 -22
  252. data/examples/permutation/permutation.rb +0 -16
  253. data/examples/poly/bell.rb +0 -6
  254. data/examples/poly/bessel.rb +0 -6
  255. data/examples/poly/cheb.rb +0 -6
  256. data/examples/poly/cheb_II.rb +0 -6
  257. data/examples/poly/cubic.rb +0 -9
  258. data/examples/poly/demo.rb +0 -20
  259. data/examples/poly/eval.rb +0 -28
  260. data/examples/poly/eval_derivs.rb +0 -14
  261. data/examples/poly/fit.rb +0 -21
  262. data/examples/poly/hermite.rb +0 -6
  263. data/examples/poly/poly.rb +0 -13
  264. data/examples/poly/quadratic.rb +0 -25
  265. data/examples/random/diffusion.rb +0 -34
  266. data/examples/random/gaussian.rb +0 -9
  267. data/examples/random/generator.rb +0 -27
  268. data/examples/random/hdsobol.rb +0 -21
  269. data/examples/random/poisson.rb +0 -9
  270. data/examples/random/qrng.rb +0 -19
  271. data/examples/random/randomwalk.rb +0 -37
  272. data/examples/random/randomwalk2d.rb +0 -19
  273. data/examples/random/rayleigh.rb +0 -36
  274. data/examples/random/rng.rb +0 -33
  275. data/examples/random/rngextra.rb +0 -14
  276. data/examples/roots/bisection.rb +0 -25
  277. data/examples/roots/brent.rb +0 -43
  278. data/examples/roots/demo.rb +0 -30
  279. data/examples/roots/newton.rb +0 -46
  280. data/examples/roots/recombination.gp +0 -11
  281. data/examples/roots/recombination.rb +0 -61
  282. data/examples/roots/steffenson.rb +0 -48
  283. data/examples/sf/ShiChi.rb +0 -6
  284. data/examples/sf/SiCi.rb +0 -6
  285. data/examples/sf/airy_Ai.rb +0 -8
  286. data/examples/sf/airy_Bi.rb +0 -8
  287. data/examples/sf/bessel_IK.rb +0 -12
  288. data/examples/sf/bessel_JY.rb +0 -13
  289. data/examples/sf/beta_inc.rb +0 -9
  290. data/examples/sf/clausen.rb +0 -6
  291. data/examples/sf/dawson.rb +0 -5
  292. data/examples/sf/debye.rb +0 -9
  293. data/examples/sf/dilog.rb +0 -6
  294. data/examples/sf/ellint.rb +0 -6
  295. data/examples/sf/expint.rb +0 -8
  296. data/examples/sf/fermi.rb +0 -10
  297. data/examples/sf/gamma_inc_P.rb +0 -9
  298. data/examples/sf/gegenbauer.rb +0 -8
  299. data/examples/sf/hyperg.rb +0 -7
  300. data/examples/sf/laguerre.rb +0 -19
  301. data/examples/sf/lambertW.rb +0 -5
  302. data/examples/sf/legendre_P.rb +0 -10
  303. data/examples/sf/lngamma.rb +0 -5
  304. data/examples/sf/psi.rb +0 -54
  305. data/examples/sf/sphbessel.gp +0 -27
  306. data/examples/sf/sphbessel.rb +0 -30
  307. data/examples/sf/synchrotron.rb +0 -5
  308. data/examples/sf/transport.rb +0 -10
  309. data/examples/sf/zetam1.rb +0 -5
  310. data/examples/siman.rb +0 -44
  311. data/examples/sort/heapsort.rb +0 -23
  312. data/examples/sort/heapsort_vector_complex.rb +0 -21
  313. data/examples/sort/sort.rb +0 -23
  314. data/examples/sort/sort2.rb +0 -16
  315. data/examples/stats/mean.rb +0 -17
  316. data/examples/stats/statistics.rb +0 -18
  317. data/examples/stats/test.rb +0 -9
  318. data/examples/sum.rb +0 -34
  319. data/examples/tamu_anova.rb +0 -18
  320. data/examples/vector/a.dat +0 -0
  321. data/examples/vector/add.rb +0 -56
  322. data/examples/vector/b.dat +0 -4
  323. data/examples/vector/c.dat +0 -3
  324. data/examples/vector/collect.rb +0 -26
  325. data/examples/vector/compare.rb +0 -28
  326. data/examples/vector/complex.rb +0 -51
  327. data/examples/vector/complex_get_all.rb +0 -85
  328. data/examples/vector/complex_set_all.rb +0 -131
  329. data/examples/vector/complex_view_all.rb +0 -77
  330. data/examples/vector/connect.rb +0 -22
  331. data/examples/vector/decimate.rb +0 -38
  332. data/examples/vector/diff.rb +0 -31
  333. data/examples/vector/filescan.rb +0 -17
  334. data/examples/vector/floor.rb +0 -23
  335. data/examples/vector/get_all.rb +0 -82
  336. data/examples/vector/gnuplot.rb +0 -38
  337. data/examples/vector/graph.rb +0 -28
  338. data/examples/vector/histogram.rb +0 -22
  339. data/examples/vector/linspace.rb +0 -24
  340. data/examples/vector/log.rb +0 -17
  341. data/examples/vector/logic.rb +0 -33
  342. data/examples/vector/logspace.rb +0 -25
  343. data/examples/vector/minmax.rb +0 -47
  344. data/examples/vector/mul.rb +0 -49
  345. data/examples/vector/narray.rb +0 -46
  346. data/examples/vector/read.rb +0 -29
  347. data/examples/vector/set.rb +0 -35
  348. data/examples/vector/set_all.rb +0 -121
  349. data/examples/vector/smpv.dat +0 -15
  350. data/examples/vector/test.rb +0 -43
  351. data/examples/vector/test_gslblock.rb +0 -58
  352. data/examples/vector/vector.rb +0 -110
  353. data/examples/vector/view.rb +0 -35
  354. data/examples/vector/view_all.rb +0 -73
  355. data/examples/vector/where.rb +0 -29
  356. data/examples/vector/write.rb +0 -24
  357. data/examples/vector/zip.rb +0 -34
  358. data/examples/wavelet/ecg.dat +0 -256
  359. data/examples/wavelet/wavelet1.rb +0 -50
  360. data/ext/gsl_native/alf.c +0 -206
  361. data/ext/gsl_native/array.c +0 -553
  362. data/ext/gsl_native/array_complex.c +0 -245
  363. data/ext/gsl_native/blas.c +0 -28
  364. data/ext/gsl_native/blas1.c +0 -733
  365. data/ext/gsl_native/blas2.c +0 -1088
  366. data/ext/gsl_native/blas3.c +0 -880
  367. data/ext/gsl_native/block.c +0 -40
  368. data/ext/gsl_native/block_source.h +0 -885
  369. data/ext/gsl_native/bspline.c +0 -122
  370. data/ext/gsl_native/bundle.c +0 -3
  371. data/ext/gsl_native/cdf.c +0 -740
  372. data/ext/gsl_native/cheb.c +0 -531
  373. data/ext/gsl_native/combination.c +0 -275
  374. data/ext/gsl_native/common.c +0 -293
  375. data/ext/gsl_native/complex.c +0 -1002
  376. data/ext/gsl_native/const.c +0 -331
  377. data/ext/gsl_native/const_additional.c +0 -99
  378. data/ext/gsl_native/cqp.c +0 -283
  379. data/ext/gsl_native/deriv.c +0 -187
  380. data/ext/gsl_native/dht.c +0 -353
  381. data/ext/gsl_native/diff.c +0 -164
  382. data/ext/gsl_native/dirac.c +0 -388
  383. data/ext/gsl_native/eigen.c +0 -2322
  384. data/ext/gsl_native/error.c +0 -193
  385. data/ext/gsl_native/extconf.rb +0 -118
  386. data/ext/gsl_native/fft.c +0 -1095
  387. data/ext/gsl_native/fit.c +0 -204
  388. data/ext/gsl_native/fresnel.c +0 -312
  389. data/ext/gsl_native/function.c +0 -518
  390. data/ext/gsl_native/geometry.c +0 -139
  391. data/ext/gsl_native/graph.c +0 -1590
  392. data/ext/gsl_native/gsl.c +0 -259
  393. data/ext/gsl_native/gsl_narray.c +0 -794
  394. data/ext/gsl_native/histogram.c +0 -1964
  395. data/ext/gsl_native/histogram2d.c +0 -1042
  396. data/ext/gsl_native/histogram3d.c +0 -884
  397. data/ext/gsl_native/histogram3d_source.c +0 -749
  398. data/ext/gsl_native/histogram_find.c +0 -99
  399. data/ext/gsl_native/histogram_oper.c +0 -150
  400. data/ext/gsl_native/ieee.c +0 -88
  401. data/ext/gsl_native/include/rb_gsl.h +0 -136
  402. data/ext/gsl_native/include/rb_gsl_array.h +0 -214
  403. data/ext/gsl_native/include/rb_gsl_cheb.h +0 -19
  404. data/ext/gsl_native/include/rb_gsl_common.h +0 -348
  405. data/ext/gsl_native/include/rb_gsl_complex.h +0 -25
  406. data/ext/gsl_native/include/rb_gsl_const.h +0 -23
  407. data/ext/gsl_native/include/rb_gsl_dirac.h +0 -6
  408. data/ext/gsl_native/include/rb_gsl_eigen.h +0 -17
  409. data/ext/gsl_native/include/rb_gsl_fft.h +0 -49
  410. data/ext/gsl_native/include/rb_gsl_fit.h +0 -23
  411. data/ext/gsl_native/include/rb_gsl_function.h +0 -23
  412. data/ext/gsl_native/include/rb_gsl_graph.h +0 -68
  413. data/ext/gsl_native/include/rb_gsl_histogram.h +0 -63
  414. data/ext/gsl_native/include/rb_gsl_histogram3d.h +0 -97
  415. data/ext/gsl_native/include/rb_gsl_integration.h +0 -17
  416. data/ext/gsl_native/include/rb_gsl_interp.h +0 -41
  417. data/ext/gsl_native/include/rb_gsl_linalg.h +0 -21
  418. data/ext/gsl_native/include/rb_gsl_math.h +0 -20
  419. data/ext/gsl_native/include/rb_gsl_odeiv.h +0 -18
  420. data/ext/gsl_native/include/rb_gsl_poly.h +0 -67
  421. data/ext/gsl_native/include/rb_gsl_rational.h +0 -30
  422. data/ext/gsl_native/include/rb_gsl_rng.h +0 -20
  423. data/ext/gsl_native/include/rb_gsl_root.h +0 -22
  424. data/ext/gsl_native/include/rb_gsl_sf.h +0 -110
  425. data/ext/gsl_native/include/rb_gsl_statistics.h +0 -17
  426. data/ext/gsl_native/include/rb_gsl_tensor.h +0 -43
  427. data/ext/gsl_native/include/rb_gsl_with_narray.h +0 -31
  428. data/ext/gsl_native/include/templates_off.h +0 -87
  429. data/ext/gsl_native/include/templates_on.h +0 -241
  430. data/ext/gsl_native/integration.c +0 -1154
  431. data/ext/gsl_native/interp.c +0 -499
  432. data/ext/gsl_native/jacobi.c +0 -733
  433. data/ext/gsl_native/linalg.c +0 -3915
  434. data/ext/gsl_native/linalg_complex.c +0 -726
  435. data/ext/gsl_native/math.c +0 -706
  436. data/ext/gsl_native/matrix.c +0 -36
  437. data/ext/gsl_native/matrix_complex.c +0 -1733
  438. data/ext/gsl_native/matrix_double.c +0 -557
  439. data/ext/gsl_native/matrix_int.c +0 -255
  440. data/ext/gsl_native/matrix_source.h +0 -2708
  441. data/ext/gsl_native/min.c +0 -219
  442. data/ext/gsl_native/monte.c +0 -978
  443. data/ext/gsl_native/multifit.c +0 -1862
  444. data/ext/gsl_native/multimin.c +0 -778
  445. data/ext/gsl_native/multimin_fsdf.c +0 -156
  446. data/ext/gsl_native/multiroots.c +0 -952
  447. data/ext/gsl_native/multiset.c +0 -210
  448. data/ext/gsl_native/ndlinear.c +0 -320
  449. data/ext/gsl_native/nmf.c +0 -171
  450. data/ext/gsl_native/nmf_wrap.c +0 -75
  451. data/ext/gsl_native/ntuple.c +0 -469
  452. data/ext/gsl_native/odeiv.c +0 -947
  453. data/ext/gsl_native/ool.c +0 -879
  454. data/ext/gsl_native/permutation.c +0 -598
  455. data/ext/gsl_native/poly.c +0 -39
  456. data/ext/gsl_native/poly2.c +0 -265
  457. data/ext/gsl_native/poly_source.h +0 -1871
  458. data/ext/gsl_native/qrng.c +0 -160
  459. data/ext/gsl_native/randist.c +0 -1848
  460. data/ext/gsl_native/rational.c +0 -480
  461. data/ext/gsl_native/rng.c +0 -595
  462. data/ext/gsl_native/root.c +0 -407
  463. data/ext/gsl_native/sf.c +0 -1446
  464. data/ext/gsl_native/sf_airy.c +0 -200
  465. data/ext/gsl_native/sf_bessel.c +0 -871
  466. data/ext/gsl_native/sf_clausen.c +0 -28
  467. data/ext/gsl_native/sf_coulomb.c +0 -206
  468. data/ext/gsl_native/sf_coupling.c +0 -121
  469. data/ext/gsl_native/sf_dawson.c +0 -29
  470. data/ext/gsl_native/sf_debye.c +0 -148
  471. data/ext/gsl_native/sf_dilog.c +0 -43
  472. data/ext/gsl_native/sf_elementary.c +0 -46
  473. data/ext/gsl_native/sf_ellint.c +0 -206
  474. data/ext/gsl_native/sf_elljac.c +0 -30
  475. data/ext/gsl_native/sf_erfc.c +0 -89
  476. data/ext/gsl_native/sf_exp.c +0 -169
  477. data/ext/gsl_native/sf_expint.c +0 -201
  478. data/ext/gsl_native/sf_fermi_dirac.c +0 -148
  479. data/ext/gsl_native/sf_gamma.c +0 -343
  480. data/ext/gsl_native/sf_gegenbauer.c +0 -97
  481. data/ext/gsl_native/sf_hyperg.c +0 -203
  482. data/ext/gsl_native/sf_laguerre.c +0 -113
  483. data/ext/gsl_native/sf_lambert.c +0 -47
  484. data/ext/gsl_native/sf_legendre.c +0 -368
  485. data/ext/gsl_native/sf_log.c +0 -105
  486. data/ext/gsl_native/sf_mathieu.c +0 -235
  487. data/ext/gsl_native/sf_power.c +0 -47
  488. data/ext/gsl_native/sf_psi.c +0 -89
  489. data/ext/gsl_native/sf_synchrotron.c +0 -48
  490. data/ext/gsl_native/sf_transport.c +0 -76
  491. data/ext/gsl_native/sf_trigonometric.c +0 -210
  492. data/ext/gsl_native/sf_zeta.c +0 -115
  493. data/ext/gsl_native/signal.c +0 -303
  494. data/ext/gsl_native/siman.c +0 -713
  495. data/ext/gsl_native/sort.c +0 -207
  496. data/ext/gsl_native/spline.c +0 -377
  497. data/ext/gsl_native/stats.c +0 -787
  498. data/ext/gsl_native/sum.c +0 -168
  499. data/ext/gsl_native/tamu_anova.c +0 -56
  500. data/ext/gsl_native/tensor.c +0 -35
  501. data/ext/gsl_native/tensor_source.h +0 -1122
  502. data/ext/gsl_native/vector.c +0 -35
  503. data/ext/gsl_native/vector_complex.c +0 -2241
  504. data/ext/gsl_native/vector_double.c +0 -1433
  505. data/ext/gsl_native/vector_int.c +0 -202
  506. data/ext/gsl_native/vector_source.h +0 -3321
  507. data/ext/gsl_native/wavelet.c +0 -923
  508. data/lib/gsl.rb +0 -8
  509. data/lib/gsl/gnuplot.rb +0 -41
  510. data/lib/gsl/oper.rb +0 -43
  511. data/lib/gsl/version.rb +0 -3
  512. data/lib/ool.rb +0 -22
  513. data/lib/ool/conmin.rb +0 -30
  514. data/lib/rbgsl.rb +0 -1
  515. data/rdoc/alf.rdoc +0 -77
  516. data/rdoc/blas.rdoc +0 -269
  517. data/rdoc/bspline.rdoc +0 -42
  518. data/rdoc/changes.rdoc +0 -159
  519. data/rdoc/cheb.rdoc +0 -99
  520. data/rdoc/cholesky_complex.rdoc +0 -46
  521. data/rdoc/combi.rdoc +0 -125
  522. data/rdoc/complex.rdoc +0 -210
  523. data/rdoc/const.rdoc +0 -546
  524. data/rdoc/dht.rdoc +0 -122
  525. data/rdoc/diff.rdoc +0 -133
  526. data/rdoc/ehandling.rdoc +0 -50
  527. data/rdoc/eigen.rdoc +0 -401
  528. data/rdoc/fft.rdoc +0 -535
  529. data/rdoc/fit.rdoc +0 -284
  530. data/rdoc/function.rdoc +0 -94
  531. data/rdoc/graph.rdoc +0 -137
  532. data/rdoc/hist.rdoc +0 -409
  533. data/rdoc/hist2d.rdoc +0 -279
  534. data/rdoc/hist3d.rdoc +0 -112
  535. data/rdoc/integration.rdoc +0 -398
  536. data/rdoc/interp.rdoc +0 -231
  537. data/rdoc/intro.rdoc +0 -27
  538. data/rdoc/linalg.rdoc +0 -681
  539. data/rdoc/linalg_complex.rdoc +0 -88
  540. data/rdoc/math.rdoc +0 -276
  541. data/rdoc/matrix.rdoc +0 -1093
  542. data/rdoc/min.rdoc +0 -189
  543. data/rdoc/monte.rdoc +0 -234
  544. data/rdoc/multimin.rdoc +0 -312
  545. data/rdoc/multiroot.rdoc +0 -293
  546. data/rdoc/narray.rdoc +0 -177
  547. data/rdoc/ndlinear.rdoc +0 -250
  548. data/rdoc/nonlinearfit.rdoc +0 -348
  549. data/rdoc/ntuple.rdoc +0 -88
  550. data/rdoc/odeiv.rdoc +0 -378
  551. data/rdoc/perm.rdoc +0 -221
  552. data/rdoc/poly.rdoc +0 -335
  553. data/rdoc/qrng.rdoc +0 -90
  554. data/rdoc/randist.rdoc +0 -233
  555. data/rdoc/ref.rdoc +0 -93
  556. data/rdoc/rng.rdoc +0 -203
  557. data/rdoc/roots.rdoc +0 -305
  558. data/rdoc/sf.rdoc +0 -1622
  559. data/rdoc/siman.rdoc +0 -89
  560. data/rdoc/sort.rdoc +0 -94
  561. data/rdoc/start.rdoc +0 -16
  562. data/rdoc/stats.rdoc +0 -219
  563. data/rdoc/sum.rdoc +0 -65
  564. data/rdoc/tensor.rdoc +0 -251
  565. data/rdoc/tut.rdoc +0 -5
  566. data/rdoc/use.rdoc +0 -177
  567. data/rdoc/vector.rdoc +0 -1243
  568. data/rdoc/vector_complex.rdoc +0 -347
  569. data/rdoc/wavelet.rdoc +0 -218
  570. data/test/gsl/blas_test.rb +0 -79
  571. data/test/gsl/bspline_test.rb +0 -63
  572. data/test/gsl/cdf_test.rb +0 -1512
  573. data/test/gsl/cheb_test.rb +0 -80
  574. data/test/gsl/combination_test.rb +0 -100
  575. data/test/gsl/complex_test.rb +0 -20
  576. data/test/gsl/const_test.rb +0 -29
  577. data/test/gsl/deriv_test.rb +0 -62
  578. data/test/gsl/dht_test.rb +0 -79
  579. data/test/gsl/diff_test.rb +0 -53
  580. data/test/gsl/eigen_test.rb +0 -563
  581. data/test/gsl/err_test.rb +0 -23
  582. data/test/gsl/fit_test.rb +0 -101
  583. data/test/gsl/histo_test.rb +0 -14
  584. data/test/gsl/index_test.rb +0 -61
  585. data/test/gsl/integration_test.rb +0 -274
  586. data/test/gsl/interp_test.rb +0 -27
  587. data/test/gsl/linalg_test.rb +0 -463
  588. data/test/gsl/matrix_nmf_test.rb +0 -37
  589. data/test/gsl/matrix_test.rb +0 -98
  590. data/test/gsl/min_test.rb +0 -89
  591. data/test/gsl/monte_test.rb +0 -77
  592. data/test/gsl/multifit_test.rb +0 -753
  593. data/test/gsl/multimin_test.rb +0 -157
  594. data/test/gsl/multiroot_test.rb +0 -135
  595. data/test/gsl/multiset_test.rb +0 -52
  596. data/test/gsl/odeiv_test.rb +0 -275
  597. data/test/gsl/oper_test.rb +0 -98
  598. data/test/gsl/poly_test.rb +0 -338
  599. data/test/gsl/qrng_test.rb +0 -94
  600. data/test/gsl/quartic_test.rb +0 -28
  601. data/test/gsl/randist_test.rb +0 -122
  602. data/test/gsl/rng_test.rb +0 -303
  603. data/test/gsl/roots_test.rb +0 -78
  604. data/test/gsl/sf_test.rb +0 -2079
  605. data/test/gsl/stats_test.rb +0 -122
  606. data/test/gsl/sum_test.rb +0 -69
  607. data/test/gsl/tensor_test.rb +0 -396
  608. data/test/gsl/vector_test.rb +0 -223
  609. data/test/gsl/wavelet_test.rb +0 -130
  610. data/test/gsl_test.rb +0 -321
  611. data/test/test_helper.rb +0 -42
  612. data/uncrustify.cfg +0 -1693
@@ -1,39 +0,0 @@
1
- /*
2
- poly.c
3
- Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
- (C) Copyright 2001-2006 by Yoshiki Tsunesada
5
-
6
- Ruby/GSL is free software: you can redistribute it and/or modify it
7
- under the terms of the GNU General Public License.
8
- This library is distributed in the hope that it will be useful, but
9
- WITHOUT ANY WARRANTY.
10
- */
11
-
12
- #include "include/rb_gsl_poly.h"
13
- #include "include/rb_gsl_array.h"
14
- #include "include/rb_gsl_common.h"
15
-
16
- void Init_gsl_poly_init(VALUE module);
17
- void Init_gsl_poly_int_init(VALUE module);
18
- void Init_gsl_poly2(VALUE module);
19
-
20
- #define BASE_DOUBLE
21
- #include "include/templates_on.h"
22
- #include "poly_source.h"
23
- #include "include/templates_off.h"
24
- void Init_gsl_poly(VALUE module)
25
- {
26
- Init_gsl_poly_init(module);
27
- }
28
-
29
- #undef BASE_DOUBLE
30
-
31
- #define BASE_INT
32
- #include "include/templates_on.h"
33
- #include "poly_source.h"
34
- #include "include/templates_off.h"
35
- void Init_gsl_poly_int(VALUE module)
36
- {
37
- Init_gsl_poly_int_init(module);
38
- }
39
- #undef BASE_INT
@@ -1,265 +0,0 @@
1
- /*
2
- poly2.c
3
- Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
- (C) Copyright 2004 by Yoshiki Tsunesada
5
-
6
- Ruby/GSL is free software: you can redistribute it and/or modify it
7
- under the terms of the GNU General Public License.
8
- This library is distributed in the hope that it will be useful, but
9
- WITHOUT ANY WARRANTY.
10
- */
11
-
12
- #include "include/rb_gsl_poly.h"
13
- #include "include/rb_gsl_math.h"
14
- #include "include/rb_gsl_array.h"
15
- #include <gsl/gsl_sf_gamma.h>
16
-
17
- static gsl_poly_int* mygsl_poly_hermite(int n1)
18
- {
19
- size_t n;
20
- gsl_vector_int *p1, *p2, *p0;
21
- int coef1[2] = {0, 2};
22
- int coef2[3] = {-2, 0, 4};
23
- if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
24
- p0 = gsl_vector_int_calloc(n1 + 1);
25
- switch (n1) {
26
- case 0:
27
- gsl_vector_int_set(p0, 0, 1);
28
- break;
29
- case 1:
30
- memcpy(p0->data, coef1, 2*sizeof(int));
31
- break;
32
- case 2:
33
- memcpy(p0->data, coef2, 3*sizeof(int));
34
- break;
35
- default:
36
- p1 = gsl_vector_int_calloc(n1 + 1);
37
- p2 = gsl_vector_int_calloc(n1 + 1);
38
- memcpy(p1->data, coef2, 3*sizeof(int));
39
- memcpy(p2->data, coef1, 2*sizeof(int));
40
- for (n = 2; (int) n < n1; n++) {
41
- gsl_vector_int_memcpy(p0, p1);
42
- mygsl_vector_int_shift_scale2(p0, n);
43
- gsl_vector_int_scale(p2, 2*n);
44
-
45
- gsl_vector_int_sub(p0, p2);
46
- /* save for the next iteration */
47
- gsl_vector_int_memcpy(p2, p1);
48
- gsl_vector_int_memcpy(p1, p0);
49
- }
50
- gsl_vector_int_free(p2);
51
- gsl_vector_int_free(p1);
52
- break;
53
- }
54
- return p0;
55
- }
56
-
57
- static gsl_poly_int* mygsl_poly_cheb(int n1)
58
- {
59
- size_t n;
60
- gsl_vector_int *p1, *p2, *p0;
61
- int coef1[2] = {0, 1};
62
- int coef2[3] = {-1, 0, 2};
63
- if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
64
- p0 = gsl_vector_int_calloc(n1 + 1);
65
- switch (n1) {
66
- case 0:
67
- gsl_vector_int_set(p0, 0, 1);
68
- break;
69
- case 1:
70
- memcpy(p0->data, coef1, 2*sizeof(int));
71
- break;
72
- case 2:
73
- memcpy(p0->data, coef2, 3*sizeof(int));
74
- break;
75
- default:
76
- p1 = gsl_vector_int_calloc(n1 + 1);
77
- p2 = gsl_vector_int_calloc(n1 + 1);
78
- memcpy(p1->data, coef2, 3*sizeof(int));
79
- memcpy(p2->data, coef1, 2*sizeof(int));
80
- for (n = 2; (int) n < n1; n++) {
81
- gsl_vector_int_memcpy(p0, p1);
82
- mygsl_vector_int_shift_scale2(p0, n);
83
-
84
- gsl_vector_int_sub(p0, p2);
85
- /* save for the next iteration */
86
- gsl_vector_int_memcpy(p2, p1);
87
- gsl_vector_int_memcpy(p1, p0);
88
- }
89
- gsl_vector_int_free(p2);
90
- gsl_vector_int_free(p1);
91
- break;
92
- }
93
- return p0;
94
- }
95
-
96
- static gsl_poly_int* mygsl_poly_chebII(int n1)
97
- {
98
- size_t n;
99
- gsl_vector_int *p1, *p2, *p0;
100
- int coef1[2] = {0, 2};
101
- int coef2[3] = {-1, 0, 4};
102
- if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
103
- p0 = gsl_vector_int_calloc(n1 + 1);
104
- switch (n1) {
105
- case 0:
106
- gsl_vector_int_set(p0, 0, 1);
107
- break;
108
- case 1:
109
- memcpy(p0->data, coef1, 2*sizeof(int));
110
- break;
111
- case 2:
112
- memcpy(p0->data, coef2, 3*sizeof(int));
113
- break;
114
- default:
115
- p1 = gsl_vector_int_calloc(n1 + 1);
116
- p2 = gsl_vector_int_calloc(n1 + 1);
117
- memcpy(p1->data, coef2, 3*sizeof(int));
118
- memcpy(p2->data, coef1, 2*sizeof(int));
119
- for (n = 2; (int) n < n1; n++) {
120
- gsl_vector_int_memcpy(p0, p1);
121
- mygsl_vector_int_shift_scale2(p0, n);
122
- gsl_vector_int_sub(p0, p2);
123
- /* save for the next iteration */
124
- gsl_vector_int_memcpy(p2, p1);
125
- gsl_vector_int_memcpy(p1, p0);
126
- }
127
- gsl_vector_int_free(p2);
128
- gsl_vector_int_free(p1);
129
- break;
130
- }
131
- return p0;
132
- }
133
-
134
- static gsl_poly_int* mygsl_poly_laguerre(int n)
135
- {
136
- size_t m, k;
137
- int val;
138
- gsl_vector_int *p0;
139
- if (n < 0) rb_raise(rb_eArgError, "order must be >= 0");
140
- p0 = gsl_vector_int_calloc(n + 1);
141
- switch (n) {
142
- case 0:
143
- gsl_vector_int_set(p0, 0, 1);
144
- break;
145
- case 1:
146
- gsl_vector_int_set(p0, 0, 1);
147
- gsl_vector_int_set(p0, 1, -1);
148
- break;
149
- default:
150
- k = gsl_sf_fact(n);
151
- for (m = 0; (int) m <= n; m++) {
152
- val = k*k/gsl_sf_fact(n-m)/gsl_pow_2(gsl_sf_fact(m));
153
- if (m%2 == 1) val *= -1;
154
- gsl_vector_int_set(p0, m, val);
155
- }
156
- break;
157
- }
158
- return p0;
159
- }
160
-
161
- static gsl_poly_int* mygsl_poly_bessel(int n)
162
- {
163
- size_t k;
164
- gsl_vector_int *p0;
165
- if (n < 0) rb_raise(rb_eArgError, "order must be >= 0");
166
- p0 = gsl_vector_int_calloc(n + 1);
167
- for (k = 0; (int) k <= n; k++) {
168
- gsl_vector_int_set(p0, k, gsl_sf_fact(n+k)/gsl_sf_fact(n-k)/gsl_sf_fact(k)/((int) pow(2, k)));
169
- }
170
- return p0;
171
- }
172
-
173
- static gsl_poly_int* mygsl_poly_bell(int n1)
174
- {
175
- size_t n, j;
176
- gsl_vector_int *p1, *p0;
177
- int coef1[2] = {0, 1};
178
- int coef2[3] = {0, 1, 1};
179
- if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
180
- p0 = gsl_vector_int_calloc(n1 + 1);
181
- switch (n1) {
182
- case 0:
183
- gsl_vector_int_set(p0, 0, 1);
184
- break;
185
- case 1:
186
- memcpy(p0->data, coef1, 2*sizeof(int));
187
- break;
188
- case 2:
189
- memcpy(p0->data, coef2, 3*sizeof(int));
190
- break;
191
- default:
192
- p1 = gsl_vector_int_calloc(n1 + 1);
193
- memcpy(p1->data, coef2, 3*sizeof(int));
194
- for (n = 2; (int) n < n1; n++) {
195
- gsl_vector_int_memcpy(p0, p1);
196
- mygsl_vector_int_shift(p0, n);
197
- for (j = 0; j < n; j++) {
198
- gsl_vector_int_set(p1, j, gsl_vector_int_get(p1, j+1)*(j+1));
199
- }
200
- gsl_vector_int_set(p1, n, 0);
201
- mygsl_vector_int_shift(p1, n);
202
- gsl_vector_int_add(p0, p1);
203
- /* save for the next iteration */
204
- gsl_vector_int_memcpy(p1, p0);
205
- }
206
- gsl_vector_int_free(p1);
207
- break;
208
- }
209
- return p0;
210
- }
211
-
212
- static VALUE rb_gsl_poly_define_poly(VALUE klass, VALUE order,
213
- gsl_poly_int* (*f)(int n1)) {
214
- int n1;
215
- gsl_poly_int *pnew = NULL;
216
- CHECK_FIXNUM(order);
217
- n1 = FIX2INT(order);
218
- if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
219
- pnew = (*f)(n1);
220
- return Data_Wrap_Struct(cgsl_poly_int, 0, gsl_vector_int_free, pnew);
221
- }
222
-
223
- static VALUE rb_gsl_poly_hermite(VALUE klass, VALUE order)
224
- {
225
- return rb_gsl_poly_define_poly(klass, order, mygsl_poly_hermite);
226
- }
227
-
228
- static VALUE rb_gsl_poly_cheb(VALUE klass, VALUE order)
229
- {
230
- return rb_gsl_poly_define_poly(klass, order, mygsl_poly_cheb);
231
- }
232
-
233
- static VALUE rb_gsl_poly_chebII(VALUE klass, VALUE order)
234
- {
235
- return rb_gsl_poly_define_poly(klass, order, mygsl_poly_chebII);
236
- }
237
-
238
- static VALUE rb_gsl_poly_laguerre(VALUE klass, VALUE order)
239
- {
240
- return rb_gsl_poly_define_poly(klass, order, mygsl_poly_laguerre);
241
- }
242
-
243
- static VALUE rb_gsl_poly_bessel(VALUE klass, VALUE order)
244
- {
245
- return rb_gsl_poly_define_poly(klass, order, mygsl_poly_bessel);
246
- }
247
-
248
- static VALUE rb_gsl_poly_bell(VALUE klass, VALUE order)
249
- {
250
- return rb_gsl_poly_define_poly(klass, order, mygsl_poly_bell);
251
- }
252
-
253
- void Init_gsl_poly2(VALUE module)
254
- {
255
- rb_define_singleton_method(cgsl_poly, "hermite", rb_gsl_poly_hermite, 1);
256
- rb_define_singleton_method(cgsl_poly, "cheb", rb_gsl_poly_cheb, 1);
257
- rb_define_singleton_method(cgsl_poly, "chebyshev", rb_gsl_poly_cheb, 1);
258
- rb_define_singleton_method(cgsl_poly, "cheb_I", rb_gsl_poly_cheb, 1);
259
- rb_define_singleton_method(cgsl_poly, "chebyshev_I", rb_gsl_poly_cheb, 1);
260
- rb_define_singleton_method(cgsl_poly, "cheb_II", rb_gsl_poly_chebII, 1);
261
- rb_define_singleton_method(cgsl_poly, "chebyshev_II", rb_gsl_poly_chebII, 1);
262
- rb_define_singleton_method(cgsl_poly, "bessel", rb_gsl_poly_bessel, 1);
263
- rb_define_singleton_method(cgsl_poly, "bell", rb_gsl_poly_bell, 1);
264
- rb_define_singleton_method(cgsl_poly, "laguerre", rb_gsl_poly_laguerre, 1);
265
- }
@@ -1,1871 +0,0 @@
1
- /*
2
- poly_source.c
3
- Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
- (C) Copyright 2001-2006 by Yoshiki Tsunesada
5
-
6
- Ruby/GSL is free software: you can redistribute it and/or modify it
7
- under the terms of the GNU General Public License.
8
- This library is distributed in the hope that it will be useful, but
9
- WITHOUT ANY WARRANTY.
10
- */
11
-
12
- #ifdef BASE_DOUBLE
13
- #define NUMCONV(x) NUM2DBL(x)
14
- #define NUMCONV2(x) NUM2DBL(x)
15
- #define MAT_ROW_COL MATRIX_ROW_COL
16
- #define MAT_P MATRIX_P
17
- #define MAT_ROW_P MATRIX_ROW_P
18
- #define MAT_COL_P MATRIX_COL_P
19
- #define C_TO_VALUE rb_float_new
20
- #define C_TO_VALUE2 rb_float_new
21
- #define CHECK_MAT CHECK_MATRIX
22
- #define MAT_VIEW_P MATRIX_VIEW_P
23
- #define PRINTF_FORMAT "%4.3e "
24
- #define VEC_ROW_COL VECTOR_ROW_COL
25
- #define VEC_P VECTOR_P
26
- #define VEC_ROW_P VECTOR_ROW_P
27
- #define VEC_COL_P VECTOR_COL_P
28
- #define CHECK_VEC CHECK_VECTOR
29
- #define VEC_VIEW_P VECTOR_VIEW_P
30
- #elif defined(BASE_INT)
31
- #define NUMCONV(x) NUM2DBL(x)
32
- #define NUMCONV2(x) NUM2INT(x)
33
- #define PRINTF_FORMAT "%d "
34
- #define MAT_ROW_COL MATRIX_INT_ROW_COL
35
- #define MAT_P MATRIX_INT_P
36
- #define C_TO_VALUE INT2FIX
37
- #define C_TO_VALUE2 INT2NUM
38
- #define MAT_ROW_P MATRIX_INT_ROW_P
39
- #define MAT_COL_P MATRIX_INT_COL_P
40
- #define CHECK_MAT CHECK_MATRIX_INT
41
- #define MAT_VIEW_P MATRIX_INT_VIEW_P
42
- #define VEC_ROW_COL VECTOR_INT_ROW_COL
43
- #define VEC_P VECTOR_INT_P
44
- #define VEC_ROW_P VECTOR_INT_ROW_P
45
- #define VEC_COL_P VECTOR_INT_COL_P
46
- #define CHECK_VEC CHECK_VECTOR_INT
47
- #define VEC_VIEW_P VECTOR_INT_VIEW_P
48
- #endif
49
-
50
- #ifdef BASE_DOUBLE
51
- VALUE cgsl_poly, cgsl_poly_int;
52
- VALUE cgsl_poly_workspace;
53
- VALUE cgsl_poly_complex_workspace;
54
- VALUE cgsl_poly_dd;
55
- VALUE cgsl_poly_taylor;
56
- #endif
57
-
58
- #ifdef BASE_INT
59
- double gsl_poly_int_eval(const BASE c[], const int len, const double x)
60
- {
61
- int i;
62
- double ans = (double) c[len-1];
63
- for(i = len-1; i>0; i--) ans = (double) c[i-1] + x * ans;
64
- return ans;
65
- }
66
- #endif
67
- #ifdef BASE_DOUBLE
68
- static VALUE rb_gsl_complex_poly_complex_eval(VALUE a, VALUE b);
69
- static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
70
- {
71
- gsl_vector *v = NULL, *vx, *vnew;
72
- gsl_matrix *mx, *mnew;
73
- double rslt;
74
- int flag = 0;
75
- size_t i, N, n;
76
- VALUE val;
77
- double *ptr0;
78
- double *ptr1, *ptr2;
79
- gsl_complex *z, zz;
80
- gsl_vector_complex *vz, *vznew;
81
- if (rb_obj_is_kind_of(a, cgsl_vector_complex))
82
- return rb_gsl_complex_poly_complex_eval(a, x);
83
- switch (TYPE(a)) {
84
- case T_ARRAY:
85
- if (rb_obj_is_kind_of(rb_ary_entry(a, 0), cgsl_complex))
86
- return rb_gsl_complex_poly_complex_eval(a, x);
87
- v = make_cvector_from_rarray(a);
88
- N = v->size;
89
- ptr0 = v->data;
90
- flag = 1;
91
- break;
92
- default:
93
- if (rb_obj_is_kind_of(a, cgsl_vector)) {
94
- Data_Get_Struct(a, gsl_vector, v);
95
- N = v->size;
96
- ptr0 = v->data;
97
- #ifdef HAVE_NARRAY_H
98
- } else if (NA_IsNArray(a)) {
99
- N = NA_TOTAL(a);
100
- ptr0 = NA_PTR_TYPE(a, double*);
101
- #endif
102
- } else {
103
- rb_raise(rb_eTypeError, "Wrong argument type %s (Array, GSL::Vector or NArray expected)",
104
- rb_class2name(CLASS_OF(a)));
105
- }
106
- }
107
- switch (TYPE(x)) {
108
- case T_FIXNUM:
109
- case T_BIGNUM:
110
- case T_FLOAT:
111
- val = rb_float_new(gsl_poly_eval(ptr0, N, NUM2DBL(x)));
112
- break;
113
- case T_ARRAY:
114
- n = RARRAY_LEN(x);
115
- val = rb_ary_new2(n);
116
- for (i = 0; i < n; i++) {
117
- rslt = gsl_poly_eval(ptr0, N, NUM2DBL(rb_ary_entry(x, i)));
118
- rb_ary_store(val, i, rb_float_new(rslt));
119
- }
120
- break;
121
- default:
122
- if (rb_obj_is_kind_of(x, cgsl_vector)) {
123
- Data_Get_Struct(x, gsl_vector, vx);
124
- vnew = gsl_vector_alloc(vx->size);
125
- val = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
126
- n = vx->size;
127
- ptr1 = vx->data;
128
- ptr2 = vnew->data;
129
- } else if (rb_obj_is_kind_of(x, cgsl_matrix)) {
130
- Data_Get_Struct(x, gsl_matrix, mx);
131
- mnew = gsl_matrix_alloc(mx->size1, mx->size2);
132
- val = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
133
- n = mx->size1*mx->size2;
134
- ptr1 = mx->data;
135
- ptr2 = mnew->data;
136
- #ifdef HAVE_NARRAY_H
137
- } else if (NA_IsNArray(x)) {
138
- int shape[1];
139
- shape[0] = NA_TOTAL(x);
140
- n = shape[0];
141
- val = na_make_object(NA_DFLOAT, 1, shape, CLASS_OF(x));
142
- ptr1 = NA_PTR_TYPE(x, double*);
143
- ptr2 = NA_PTR_TYPE(val, double*);
144
- #endif
145
- } else if (rb_obj_is_kind_of(x, cgsl_complex)) {
146
- Data_Get_Struct(x, gsl_complex, z);
147
- zz = gsl_poly_complex_eval(ptr0, N, *z);
148
- z = make_complex(GSL_REAL(zz), GSL_IMAG(zz));
149
- if (flag == 1) gsl_vector_free(v);
150
- return Data_Wrap_Struct(cgsl_complex, 0, free, z);
151
- } else if (rb_obj_is_kind_of(x, cgsl_vector_complex)) {
152
- Data_Get_Struct(x, gsl_vector_complex, vz);
153
- vznew = gsl_vector_complex_alloc(vz->size);
154
- for (i = 0; i < vz->size; i++) {
155
- zz = gsl_poly_complex_eval(ptr0, N, gsl_vector_complex_get(vz, i));
156
- gsl_vector_complex_set(vznew, i, zz);
157
- }
158
- if (flag == 1) gsl_vector_free(v);
159
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vznew);
160
- } else {
161
- rb_raise(rb_eTypeError, "Wrong argument type %s (A number, Array, GSL::Vector or NArray expected)",
162
- rb_class2name(CLASS_OF(a)));
163
- }
164
- for (i = 0; i < n; i++) {
165
- ptr2[i] = gsl_poly_eval(ptr0, N, ptr1[i]);
166
- }
167
- }
168
- if (flag == 1) gsl_vector_free(v);
169
- return val;
170
- }
171
-
172
- static VALUE rb_gsl_complex_poly_complex_eval(VALUE a, VALUE b)
173
- {
174
- gsl_vector_complex *coef = NULL, *zb, *vnew;
175
- gsl_complex *zc;
176
- gsl_complex z, *zx, *res;
177
- VALUE ret;
178
- size_t i, N;
179
- int flag = 0;
180
- if (rb_obj_is_kind_of(a, cgsl_vector_complex)) {
181
- Data_Get_Struct(a, gsl_vector_complex, coef);
182
- N = coef->size;
183
- zc = (gsl_complex*) coef->data;
184
- } else if (TYPE(a) == T_ARRAY) {
185
- N = RARRAY_LEN(a);
186
- zc = (gsl_complex*) malloc(sizeof(gsl_complex));
187
- flag = 1;
188
- for (i = 0; i < N; i++) {
189
- Data_Get_Struct(rb_ary_entry(a, i), gsl_complex, zx);
190
- zc[i] = *zx;
191
- }
192
- } else {
193
- rb_raise(rb_eTypeError, "rb_gsl_complex_poly_complex_solve: wrong argument type %s (GSL::Vector::Complex or Array expected)\n", rb_class2name(CLASS_OF(a)));
194
- }
195
- switch (TYPE(b)) {
196
- case T_FIXNUM:
197
- case T_BIGNUM:
198
- case T_FLOAT:
199
- res = (gsl_complex*) malloc(sizeof(gsl_complex));
200
- ret = Data_Wrap_Struct(cgsl_complex, 0, free, res);
201
- GSL_SET_REAL(&z, NUM2DBL(b));
202
- GSL_SET_IMAG(&z, 0.0);
203
- *res = gsl_complex_poly_complex_eval(zc, coef->size, z);
204
- break;
205
- case T_ARRAY:
206
- ret = rb_ary_new2(RARRAY_LEN(b));
207
- for (i = 0; (int) i < RARRAY_LEN(b); i++) {
208
- Data_Get_Struct(rb_ary_entry(b, i), gsl_complex, zx);
209
- res = (gsl_complex*) malloc(sizeof(gsl_complex));
210
- *res = gsl_complex_poly_complex_eval(zc, N, *zx);
211
- rb_ary_store(ret, i, Data_Wrap_Struct(cgsl_complex, 0, free, res));
212
- }
213
- break;
214
- default:
215
- if (rb_obj_is_kind_of(b, cgsl_complex)) {
216
- res = (gsl_complex*) malloc(sizeof(gsl_complex));
217
- ret = Data_Wrap_Struct(cgsl_complex, 0, free, res);
218
- Data_Get_Struct(b, gsl_complex, zx);
219
- *res = gsl_complex_poly_complex_eval(zc, N, *zx);
220
- } else if (rb_obj_is_kind_of(b, cgsl_vector_complex)) {
221
- Data_Get_Struct(b, gsl_vector_complex, zb);
222
- vnew = gsl_vector_complex_alloc(zb->size);
223
- ret = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
224
- for (i = 0; i < zb->size; i++) {
225
- z = gsl_vector_complex_get(zb, i);
226
- gsl_vector_complex_set(vnew, i, gsl_complex_poly_complex_eval(zc, N, z));
227
- }
228
- } else {
229
- rb_raise(rb_eTypeError, "Wrong argument type %s.\n", rb_class2name(CLASS_OF(b)));
230
- }
231
- }
232
- if (flag == 1) free(zc);
233
- return ret;
234
- }
235
- #endif
236
-
237
- static VALUE FUNCTION(rb_gsl_poly,eval)(VALUE obj, VALUE xx)
238
- {
239
- GSL_TYPE(gsl_poly) *p = NULL;
240
- GSL_TYPE(gsl_vector) *v = NULL;
241
- GSL_TYPE(gsl_matrix) *m = NULL;
242
- gsl_vector *vnew = NULL;
243
- gsl_matrix *mnew = NULL;
244
- VALUE x, ary;
245
- size_t i, j;
246
- #ifdef BASE_DOUBLE
247
- gsl_complex *z, zz;
248
- gsl_vector_complex *vz, *vznew;
249
- #endif
250
-
251
- Data_Get_Struct(obj, GSL_TYPE(gsl_poly), p);
252
- if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
253
- switch (TYPE(xx)) {
254
- case T_FIXNUM:
255
- case T_BIGNUM:
256
- case T_FLOAT:
257
- return rb_float_new(FUNCTION(gsl_poly,eval)(p->data, p->size, NUM2DBL(xx)));
258
- break;
259
- case T_ARRAY:
260
- ary = rb_ary_new2(RARRAY_LEN(xx));
261
- for (i = 0; (int) i < RARRAY_LEN(xx); i++) {
262
- x = rb_ary_entry(xx, i);
263
- Need_Float(x);
264
- rb_ary_store(ary, i, rb_float_new(FUNCTION(gsl_poly,eval)(p->data, p->size, NUM2DBL(x))));
265
- }
266
- return ary;
267
- break;
268
- default:
269
- #ifdef BASE_DOUBLE
270
- #ifdef HAVE_NARRAY_H
271
- if (NA_IsNArray(xx)) {
272
- struct NARRAY *na;
273
- double *ptr1, *ptr2;
274
- size_t n;
275
- GetNArray(xx, na);
276
- ptr1 = (double*) na->ptr;
277
- n = na->total;
278
- ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
279
- ptr2 = NA_PTR_TYPE(ary,double*);
280
- for (i = 0; i < n; i++) ptr2[i] = FUNCTION(gsl_poly,eval)(p->data,p->size,ptr1[i]);
281
- return ary;
282
- }
283
- #endif
284
- #endif
285
- if (VEC_P(xx)) {
286
- Data_Get_Struct(xx, GSL_TYPE(gsl_vector), v);
287
- vnew = gsl_vector_alloc(v->size);
288
- for (i = 0; i < v->size; i++) {
289
- gsl_vector_set(vnew, i, FUNCTION(gsl_poly,eval)(p->data, p->size, FUNCTION(gsl_vector,get)(v, i)));
290
- }
291
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
292
- } else if (MAT_P(xx)) {
293
- Data_Get_Struct(xx, GSL_TYPE(gsl_matrix), m);
294
- mnew = gsl_matrix_alloc(m->size1, m->size2);
295
- for (i = 0; i < m->size1; i++) {
296
- for (j = 0; j < m->size2; j++) {
297
- gsl_matrix_set(mnew, i, j,
298
- FUNCTION(gsl_poly,eval)(p->data, p->size, FUNCTION(gsl_matrix,get)(m, i, j)));
299
- }
300
- }
301
- return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
302
- #ifdef BASE_DOUBLE
303
- } else if (rb_obj_is_kind_of(xx, cgsl_complex)) {
304
- Data_Get_Struct(xx, gsl_complex, z);
305
- zz = gsl_poly_complex_eval(p->data, p->size, *z);
306
- z = make_complex(GSL_REAL(zz), GSL_IMAG(zz));
307
- return Data_Wrap_Struct(cgsl_complex, 0, free, z);
308
- } else if (rb_obj_is_kind_of(xx, cgsl_vector_complex)) {
309
- Data_Get_Struct(xx, gsl_vector_complex, vz);
310
- vznew = gsl_vector_complex_alloc(vz->size);
311
- for (i = 0; i < vz->size; i++) {
312
- zz = gsl_poly_complex_eval(p->data, p->size, gsl_vector_complex_get(vz, i));
313
- gsl_vector_complex_set(vznew, i, zz);
314
- }
315
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vznew);
316
- #endif
317
- } else {
318
- rb_raise(rb_eTypeError, "wrong argument type");
319
- }
320
- break;
321
- }
322
- return Qnil; /* never reach here */
323
- }
324
-
325
- /* singleton method */
326
- static VALUE FUNCTION(rb_gsl_poly,eval2)(int argc, VALUE *argv, VALUE obj)
327
- {
328
- GSL_TYPE(gsl_poly) *p = NULL;
329
- GSL_TYPE(gsl_vector) *v = NULL;
330
- GSL_TYPE(gsl_matrix) *m = NULL;
331
- gsl_vector *vnew = NULL;
332
- gsl_matrix *mnew = NULL;
333
- VALUE xx, x, ary;
334
- size_t i, j, size;
335
- switch (argc) {
336
- case 2:
337
- Data_Get_Struct(argv[0], GSL_TYPE(gsl_poly), p);
338
- size = p->size;
339
- xx = argv[1];
340
- break;
341
- case 3:
342
- Data_Get_Struct(argv[0], GSL_TYPE(gsl_poly), p);
343
- size = FIX2INT(argv[1]);
344
- xx = argv[2];
345
- break;
346
- default:
347
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
348
- break;
349
- }
350
- if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
351
- switch (TYPE(xx)) {
352
- case T_FIXNUM:
353
- case T_BIGNUM:
354
- case T_FLOAT:
355
- return rb_float_new(FUNCTION(gsl_poly,eval)(p->data, size, NUM2DBL(xx)));
356
- break;
357
- case T_ARRAY:
358
- ary = rb_ary_new2(RARRAY_LEN(xx));
359
- for (i = 0; (int) i < RARRAY_LEN(xx); i++) {
360
- x = rb_ary_entry(xx, i);
361
- Need_Float(x);
362
- rb_ary_store(ary, i, rb_float_new(FUNCTION(gsl_poly,eval)(p->data, size, NUM2DBL(x))));
363
- }
364
- return ary;
365
- break;
366
- default:
367
- #ifdef BASE_DOUBLE
368
- #ifdef HAVE_NARRAY_H
369
- if (NA_IsNArray(xx)) {
370
- struct NARRAY *na;
371
- double *ptr1, *ptr2;
372
- GetNArray(xx, na);
373
- ptr1 = (double*) na->ptr;
374
- size = na->total;
375
- ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
376
- ptr2 = NA_PTR_TYPE(ary,double*);
377
- for (i = 0; i < size; i++) ptr2[i] = FUNCTION(gsl_poly,eval)(p->data,p->size,ptr1[i]);
378
- return ary;
379
- }
380
- #endif
381
- #endif
382
- if (VEC_P(xx)) {
383
- Data_Get_Struct(xx, GSL_TYPE(gsl_vector), v);
384
- vnew = gsl_vector_alloc(v->size);
385
- for (i = 0; i < v->size; i++) {
386
- gsl_vector_set(vnew, i, FUNCTION(gsl_poly,eval)(p->data, size, FUNCTION(gsl_vector,get)(v, i)));
387
- }
388
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
389
- } else if (MAT_P(xx)) {
390
- Data_Get_Struct(xx, GSL_TYPE(gsl_matrix), m);
391
- mnew = gsl_matrix_alloc(m->size1, m->size2);
392
- for (i = 0; i < m->size1; i++) {
393
- for (j = 0; j < m->size2; j++) {
394
- gsl_matrix_set(mnew, i, j,
395
- FUNCTION(gsl_poly,eval)(p->data, size, FUNCTION(gsl_matrix,get)(m, i, j)));
396
- }
397
- }
398
- return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
399
- } else {
400
- rb_raise(rb_eTypeError, "wrong argument type");
401
- }
402
- break;
403
- }
404
- return Qnil; /* never reach here */
405
- }
406
-
407
- /* ax*x + bx + c = 0 */
408
- static VALUE FUNCTION(rb_gsl_poly,solve_quadratic)(int argc, VALUE *argv, VALUE obj)
409
- {
410
- double x0, x1;
411
- GSL_TYPE(gsl_poly) *v = NULL;
412
- gsl_vector *r;
413
- int n;
414
- switch (argc) {
415
- case 3:
416
- n = gsl_poly_solve_quadratic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
417
- &x0, &x1);
418
- break;
419
- case 1:
420
- switch (TYPE(argv[0])) {
421
- case T_ARRAY:
422
- n = gsl_poly_solve_quadratic(NUMCONV2(rb_ary_entry(argv[0], 0)),
423
- NUMCONV2(rb_ary_entry(argv[0], 1)),
424
- NUMCONV2(rb_ary_entry(argv[0], 2)),
425
- &x0, &x1);
426
- break;
427
- default:
428
- CHECK_VEC(argv[0]);
429
- Data_Get_Struct(argv[0], GSL_TYPE(gsl_poly), v);
430
- n = gsl_poly_solve_quadratic(FUNCTION(gsl_vector,get)(v, 0),
431
- FUNCTION(gsl_vector,get)(v, 1),
432
- FUNCTION(gsl_vector,get)(v, 2),
433
- &x0, &x1);
434
- break;
435
- }
436
- break;
437
- default:
438
- rb_raise(rb_eArgError,
439
- "wrong number of arguments (3 numbers or 1 array or 1 vector)");
440
- break;
441
- }
442
- // If n == 0, we want to return an empty gsl_vector, but gsl_vectors can'y be
443
- // empty, so just return an empty Array.
444
- if(n == 0) {
445
- return rb_ary_new();
446
- }
447
- r = gsl_vector_alloc(n);
448
- switch(n) {
449
- case 2: gsl_vector_set(r, 1, x1); /* fall through */
450
- case 1: gsl_vector_set(r, 0, x0);
451
- }
452
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
453
- }
454
-
455
- static VALUE FUNCTION(rb_gsl_poly,complex_solve_quadratic)(int argc, VALUE *argv, VALUE obj)
456
- {
457
- gsl_complex z0, z1;
458
- GSL_TYPE(gsl_vector) *v = NULL;
459
- gsl_vector_complex *r = NULL;
460
- int n;
461
- switch (argc) {
462
- case 3:
463
- n = gsl_poly_complex_solve_quadratic(NUMCONV2(argv[0]),
464
- NUMCONV2(argv[1]), NUMCONV2(argv[2]),
465
- &z0, &z1);
466
- break;
467
- case 1:
468
- switch (TYPE(argv[0])) {
469
- case T_ARRAY:
470
- n = gsl_poly_complex_solve_quadratic(NUMCONV2(rb_ary_entry(argv[0], 0)),
471
- NUMCONV2(rb_ary_entry(argv[0], 1)),
472
- NUMCONV2(rb_ary_entry(argv[0], 2)),
473
- &z0, &z1);
474
- break;
475
- default:
476
- CHECK_VEC(argv[0]);
477
- Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
478
- n = gsl_poly_complex_solve_quadratic(FUNCTION(gsl_vector,get)(v, 0),
479
- FUNCTION(gsl_vector,get)(v, 1),
480
- FUNCTION(gsl_vector,get)(v, 2),
481
- &z0, &z1);
482
- break;
483
- }
484
- break;
485
- default:
486
- rb_raise(rb_eArgError,
487
- "wrong number of arguments (3 numbers or 1 array or 1 vector)");
488
- break;
489
- }
490
- // If n == 0, we want to return an empty gsl_vector, but gsl_vectors can'y be
491
- // empty, so just return an empty Array.
492
- if(n == 0) {
493
- return rb_ary_new();
494
- }
495
- r = gsl_vector_complex_alloc(n);
496
- switch(n) {
497
- case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
498
- case 1: gsl_vector_complex_set(r, 0, z0);
499
- }
500
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
501
- }
502
-
503
- static VALUE FUNCTION(rb_gsl_poly,solve_cubic)(int argc, VALUE *argv, VALUE obj)
504
- {
505
- double x0, x1, x2;
506
- GSL_TYPE(gsl_vector) *v = NULL;
507
- gsl_vector *r = NULL;
508
- int n;
509
- switch (argc) {
510
- case 3:
511
- n = gsl_poly_solve_cubic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
512
- &x0, &x1, &x2);
513
- break;
514
- case 1:
515
- switch (TYPE(argv[0])) {
516
- case T_ARRAY:
517
- n = gsl_poly_solve_cubic(NUMCONV2(rb_ary_entry(argv[0], 0)),
518
- NUMCONV2(rb_ary_entry(argv[0], 1)),
519
- NUMCONV2(rb_ary_entry(argv[0], 2)),
520
- &x0, &x1, &x2);
521
- break;
522
- default:
523
- CHECK_VEC(argv[0]);
524
- Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
525
- n = gsl_poly_solve_cubic(FUNCTION(gsl_vector,get)(v, 0),
526
- FUNCTION(gsl_vector,get)(v, 1),
527
- FUNCTION(gsl_vector,get)(v, 2),
528
- &x0, &x1, &x2);
529
- break;
530
- }
531
- break;
532
- default:
533
- rb_raise(rb_eArgError,
534
- "wrong number of arguments (3 numbers or 1 array or 1 vector)");
535
- break;
536
- }
537
- r = gsl_vector_alloc(n);
538
- switch(n) {
539
- case 3: gsl_vector_set(r, 2, x2); /* fall through */
540
- case 2: gsl_vector_set(r, 1, x1); /* fall through */
541
- case 1: gsl_vector_set(r, 0, x0);
542
- }
543
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
544
- }
545
-
546
- static VALUE FUNCTION(rb_gsl_poly,complex_solve_cubic)(int argc, VALUE *argv, VALUE obj)
547
- {
548
- gsl_complex z0, z1, z2;
549
- GSL_TYPE(gsl_vector) *v = NULL;
550
- gsl_vector_complex *r = NULL;
551
- int n;
552
- switch (argc) {
553
- case 3:
554
- n = gsl_poly_complex_solve_cubic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
555
- &z0, &z1, &z2);
556
- break;
557
- case 1:
558
- switch (TYPE(argv[0])) {
559
- case T_ARRAY:
560
- n = gsl_poly_complex_solve_cubic(NUMCONV2(rb_ary_entry(argv[0], 0)),
561
- NUMCONV2(rb_ary_entry(argv[0], 1)),
562
- NUMCONV2(rb_ary_entry(argv[0], 2)),
563
- &z0, &z1, &z2);
564
- break;
565
- default:
566
- CHECK_VEC(argv[0]);
567
- Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
568
- n = gsl_poly_complex_solve_cubic(FUNCTION(gsl_vector,get)(v, 0),
569
- FUNCTION(gsl_vector,get)(v, 1),
570
- FUNCTION(gsl_vector,get)(v, 2),
571
- &z0, &z1, &z2);
572
- break;
573
- }
574
- break;
575
- default:
576
- rb_raise(rb_eArgError,
577
- "wrong number of arguments (3 numbers or 1 array or 1 vector)");
578
- break;
579
- }
580
- r = gsl_vector_complex_alloc(n);
581
- switch(n) {
582
- case 3: gsl_vector_complex_set(r, 2, z2); /* fall through */
583
- case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
584
- case 1: gsl_vector_complex_set(r, 0, z0);
585
- }
586
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
587
- }
588
-
589
- #ifdef HAVE_GSL_POLY_SOLVE_QUARTIC
590
- static VALUE FUNCTION(rb_gsl_poly,solve_quartic)(int argc, VALUE *argv, VALUE obj)
591
- {
592
- double x0, x1, x2, x3;
593
- GSL_TYPE(gsl_vector) *v = NULL;
594
- gsl_vector *r = NULL;
595
- int n;
596
- switch (argc) {
597
- case 4:
598
- n = gsl_poly_solve_quartic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
599
- NUMCONV2(argv[3]),
600
- &x0, &x1, &x2, &x3);
601
- break;
602
- case 1:
603
- switch (TYPE(argv[0])) {
604
- case T_ARRAY:
605
- n = gsl_poly_solve_quartic(NUMCONV2(rb_ary_entry(argv[0], 0)),
606
- NUMCONV2(rb_ary_entry(argv[0], 1)),
607
- NUMCONV2(rb_ary_entry(argv[0], 2)),
608
- NUMCONV2(rb_ary_entry(argv[0], 3)),
609
- &x0, &x1, &x2, &x3);
610
- break;
611
- default:
612
- CHECK_VEC(argv[0]);
613
- Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
614
- n = gsl_poly_solve_quartic(FUNCTION(gsl_vector,get)(v, 0),
615
- FUNCTION(gsl_vector,get)(v, 1),
616
- FUNCTION(gsl_vector,get)(v, 2),
617
- FUNCTION(gsl_vector,get)(v, 3),
618
- &x0, &x1, &x2, &x3);
619
- break;
620
- }
621
- break;
622
- default:
623
- rb_raise(rb_eArgError,
624
- "wrong number of arguments (3 numbers or 1 array or 1 vector)");
625
- break;
626
- }
627
- r = gsl_vector_alloc(n);
628
- switch(n) {
629
- case 4: gsl_vector_set(r, 3, x3); /* fall through */
630
- case 3: gsl_vector_set(r, 2, x2); /* fall through */
631
- case 2: gsl_vector_set(r, 1, x1); /* fall through */
632
- case 1: gsl_vector_set(r, 0, x0);
633
- }
634
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
635
- }
636
-
637
- static VALUE FUNCTION(rb_gsl_poly,complex_solve_quartic)(int argc, VALUE *argv, VALUE obj)
638
- {
639
- gsl_complex z0, z1, z2, z3;
640
- GSL_TYPE(gsl_vector) *v = NULL;
641
- gsl_vector_complex *r = NULL;
642
- int n;
643
- switch (argc) {
644
- case 4:
645
- n = gsl_poly_complex_solve_quartic(NUMCONV2(argv[0]), NUMCONV2(argv[1]),
646
- NUMCONV2(argv[2]), NUMCONV2(argv[3]),
647
- &z0, &z1, &z2, &z3);
648
- break;
649
- case 1:
650
- switch (TYPE(argv[0])) {
651
- case T_ARRAY:
652
- n = gsl_poly_complex_solve_quartic(NUMCONV2(rb_ary_entry(argv[0], 0)),
653
- NUMCONV2(rb_ary_entry(argv[0], 1)),
654
- NUMCONV2(rb_ary_entry(argv[0], 2)),
655
- NUMCONV2(rb_ary_entry(argv[0], 3)),
656
- &z0, &z1, &z2, &z3);
657
- break;
658
- default:
659
- CHECK_VEC(argv[0]);
660
- Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
661
- n = gsl_poly_complex_solve_quartic(FUNCTION(gsl_vector,get)(v, 0),
662
- FUNCTION(gsl_vector,get)(v, 1),
663
- FUNCTION(gsl_vector,get)(v, 2),
664
- FUNCTION(gsl_vector,get)(v, 3),
665
- &z0, &z1, &z2, &z3);
666
- break;
667
- }
668
- break;
669
- default:
670
- rb_raise(rb_eArgError,
671
- "wrong number of arguments (3 numbers or 1 array or 1 vector)");
672
- break;
673
- }
674
- r = gsl_vector_complex_alloc(n);
675
- switch(n) {
676
- case 4: gsl_vector_complex_set(r, 0, z0); /* fall through */
677
- case 3: gsl_vector_complex_set(r, 1, z1); /* fall through */
678
- case 2: gsl_vector_complex_set(r, 2, z2); /* fall through */
679
- case 1: gsl_vector_complex_set(r, 3, z3);
680
- }
681
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
682
- }
683
-
684
- #endif
685
- /* singleton method */
686
- VALUE FUNCTION(rb_gsl_poly,complex_solve)(int argc, VALUE *argv, VALUE obj)
687
- {
688
- int size = -1, size2;
689
- gsl_poly_complex_workspace *w = NULL;
690
- GSL_TYPE(gsl_vector) *v = NULL;
691
- gsl_vector *a = NULL, *z = NULL;
692
- gsl_complex c;
693
- gsl_vector_complex *r = NULL;
694
- int i, flag = 0;
695
- // local variable "status" declared and set, but never used
696
- //int status;
697
-
698
- switch (argc) {
699
- case 1:
700
- break;
701
- case 2:
702
- if (TYPE(argv[1]) == T_FIXNUM) size = FIX2INT(argv[1]);
703
- break;
704
- case 3:
705
- if (TYPE(argv[1]) == T_FIXNUM) size = FIX2INT(argv[1]);
706
- break;
707
- default:
708
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1-3)", argc);
709
- break;
710
- }
711
-
712
- switch (TYPE(argv[0])) {
713
- case T_ARRAY:
714
- if (size < 0) size = RARRAY_LEN(argv[0]);
715
- a = gsl_vector_alloc(size);
716
- for (i = 0; i < size; i++) gsl_vector_set(a, i, NUMCONV2(rb_ary_entry(argv[0], i)));
717
- break;
718
- case T_FIXNUM:
719
- case T_BIGNUM:
720
- case T_FLOAT:
721
- if (rb_obj_is_kind_of(argv[argc-1], cgsl_poly_workspace)) size = argc - 1;
722
- else size = argc;
723
- a = gsl_vector_alloc(size);
724
- for (i = 0; i < size; i++) gsl_vector_set(a, i, NUMCONV2(argv[i]));
725
- break;
726
- default:
727
- if (rb_obj_is_kind_of(argv[0], GSL_TYPE(cgsl_vector))) {
728
- Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
729
- if (size < 0) size = v->size;
730
- } else {
731
- rb_raise(rb_eTypeError, "wrong argument type (Array, Vector, or Numeric expected");
732
- }
733
- a = gsl_vector_alloc(v->size);
734
- for (i = 0; i < size; i++) gsl_vector_set(a, i, FUNCTION(gsl_vector,get)(v, i));
735
- break;
736
- }
737
- size2 = 2*(size - 1);
738
- z = gsl_vector_alloc(size2);
739
- if (rb_obj_is_kind_of(argv[argc-1], cgsl_poly_workspace)
740
- || rb_obj_is_kind_of(argv[argc-1], cgsl_poly_complex_workspace)) {
741
- Data_Get_Struct(argv[argc-1], gsl_poly_complex_workspace, w);
742
- flag = 0;
743
- } else {
744
- w = gsl_poly_complex_workspace_alloc(size);
745
- flag = 1;
746
- }
747
- /*status =*/ gsl_poly_complex_solve(a->data, size, w, z->data);
748
-
749
- if (flag == 1) gsl_poly_complex_workspace_free(w);
750
- gsl_vector_free(a);
751
- r = gsl_vector_complex_alloc(size - 1);
752
- for (i = 0; i < size - 1; i++) {
753
- c.dat[0] = gsl_vector_get(z, i*2);
754
- c.dat[1] = gsl_vector_get(z, i*2+1);
755
- gsl_vector_complex_set(r, i, c);
756
- }
757
- gsl_vector_free(z);
758
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
759
- }
760
-
761
-
762
- /* a2 x*x + a1 x + a0 = 0 */
763
- static VALUE FUNCTION(rb_gsl_poly,solve_quadratic2)(VALUE obj)
764
- {
765
- GSL_TYPE(gsl_vector) *v = NULL;
766
- gsl_vector *r = NULL;
767
- gsl_vector_complex *r2 = NULL;
768
- double a2, a1, a0;
769
- double d; /* determinant */
770
- double x0, x1;
771
- int n;
772
- gsl_complex z0, z1;
773
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
774
- if (v->size < 3) {
775
- rb_raise(rb_eArgError, "the order of the object is less than 3.");
776
- }
777
- a2 = FUNCTION(gsl_vector,get)(v, 2); /* coefficients */
778
- a1 = FUNCTION(gsl_vector,get)(v, 1);
779
- a0 = FUNCTION(gsl_vector,get)(v, 0);
780
- d = a1*a1 - 4.0*a2*a0; /* determinant */
781
- if (d >= 0.0) {
782
- n = gsl_poly_solve_quadratic(a2, a1, a0, &x0, &x1);
783
- r = gsl_vector_alloc(n);
784
- switch(n) {
785
- case 2: gsl_vector_set(r, 1, x1); /* fall through */
786
- case 1: gsl_vector_set(r, 0, x0);
787
- }
788
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
789
- } else {
790
- n = gsl_poly_complex_solve_quadratic(a2, a1, a0, &z0, &z1);
791
- r2 = gsl_vector_complex_alloc(n);
792
- switch(n) {
793
- case 2: gsl_vector_complex_set(r2, 1, z1); /* fall through */
794
- case 1: gsl_vector_complex_set(r2, 0, z0);
795
- }
796
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r2);
797
- }
798
- }
799
-
800
-
801
- static VALUE FUNCTION(rb_gsl_poly,complex_solve_quadratic2)(VALUE obj)
802
- {
803
- GSL_TYPE(gsl_vector) *v = NULL;
804
- gsl_vector_complex *r = NULL;
805
- double a2, a1, a0;
806
- int n;
807
- gsl_complex z0, z1;
808
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
809
- if (v->size < 3) {
810
- rb_raise(rb_eArgError, "the order of the object is less than 3.");
811
- }
812
- a2 = FUNCTION(gsl_vector,get)(v, 2); /* coefficients */
813
- a1 = FUNCTION(gsl_vector,get)(v, 1);
814
- a0 = FUNCTION(gsl_vector,get)(v, 0);
815
- n = gsl_poly_complex_solve_quadratic(a2, a1, a0, &z0, &z1);
816
- r = gsl_vector_complex_alloc(n);
817
- switch(n) {
818
- case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
819
- case 1: gsl_vector_complex_set(r, 0, z0);
820
- }
821
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
822
- }
823
-
824
- /* x**3 + a2 x**2 + a1 x + a0 = 0 */
825
- static VALUE FUNCTION(rb_gsl_poly,solve_cubic2)(VALUE obj)
826
- {
827
- GSL_TYPE(gsl_vector) *v = NULL;
828
- gsl_vector *r = NULL;
829
- double a3, a2, a1, a0;
830
- double x0, x1, x2;
831
- int n;
832
-
833
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
834
- if (v->size < 4) {
835
- rb_raise(rb_eArgError, "the order of the object is less than 4.");
836
- }
837
- a3 = FUNCTION(gsl_vector,get)(v, 3);
838
- a2 = FUNCTION(gsl_vector,get)(v, 2)/a3; /* coefficients */
839
- a1 = FUNCTION(gsl_vector,get)(v, 1)/a3;
840
- a0 = FUNCTION(gsl_vector,get)(v, 0)/a3;
841
- n = gsl_poly_solve_cubic(a2, a1, a0, &x0, &x1, &x2);
842
- r = gsl_vector_alloc(n);
843
- switch(n) {
844
- case 3: gsl_vector_set(r, 2, x2); /* fall through */
845
- case 2: gsl_vector_set(r, 1, x1); /* fall through */
846
- case 1: gsl_vector_set(r, 0, x0);
847
- }
848
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
849
- }
850
-
851
- static VALUE FUNCTION(rb_gsl_poly,complex_solve_cubic2)(VALUE obj)
852
- {
853
- GSL_TYPE(gsl_vector) *v = NULL;
854
- gsl_vector_complex *r = NULL;
855
- double a3, a2, a1, a0;
856
- int n;
857
- gsl_complex z0, z1, z2;
858
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
859
- if (v->size < 4) {
860
- rb_raise(rb_eArgError, "the order of the object is less than 4.");
861
- }
862
- a3 = FUNCTION(gsl_vector,get)(v, 3);
863
- a2 = FUNCTION(gsl_vector,get)(v, 2)/a3; /* coefficients */
864
- a1 = FUNCTION(gsl_vector,get)(v, 1)/a3;
865
- a0 = FUNCTION(gsl_vector,get)(v, 0)/a3;
866
- n = gsl_poly_complex_solve_cubic(a2, a1, a0, &z0, &z1, &z2);
867
- r = gsl_vector_complex_alloc(n);
868
- switch(n) {
869
- case 3: gsl_vector_complex_set(r, 2, z2); /* fall through */
870
- case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
871
- case 1: gsl_vector_complex_set(r, 0, z0);
872
- }
873
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
874
- }
875
-
876
- #ifdef HAVE_GSL_POLY_SOLVE_QUARTIC
877
- /* a4 x**4 + a3 x**3 + a2 x**2 + a1 x + a0 = 0 */
878
- static VALUE FUNCTION(rb_gsl_poly,solve_quartic2)(VALUE obj)
879
- {
880
- GSL_TYPE(gsl_vector) *v = NULL;
881
- gsl_vector *r = NULL;
882
- double a4, a3, a2, a1, a0;
883
- double x0, x1, x2, x3;
884
- int n;
885
-
886
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
887
- if (v->size < 5) {
888
- rb_raise(rb_eArgError, "the order of the object is less than 4.");
889
- }
890
- a4 = FUNCTION(gsl_vector,get)(v, 4);
891
- a3 = FUNCTION(gsl_vector,get)(v, 3)/a4;
892
- a2 = FUNCTION(gsl_vector,get)(v, 2)/a4; /* coefficients */
893
- a1 = FUNCTION(gsl_vector,get)(v, 1)/a4;
894
- a0 = FUNCTION(gsl_vector,get)(v, 0)/a4;
895
- n = gsl_poly_solve_quartic(a3, a2, a1, a0, &x0, &x1, &x2, &x3);
896
- r = gsl_vector_alloc(3);
897
- r = gsl_vector_alloc(4);
898
- gsl_vector_set(r, 0, x0);
899
- gsl_vector_set(r, 1, x1);
900
- gsl_vector_set(r, 2, x2);
901
- gsl_vector_set(r, 3, x3);
902
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
903
- }
904
-
905
- static VALUE FUNCTION(rb_gsl_poly,complex_solve_quartic2)(VALUE obj)
906
- {
907
- GSL_TYPE(gsl_vector) *v = NULL;
908
- gsl_vector_complex *r = NULL;
909
- double a4, a3, a2, a1, a0;
910
- int n;
911
- gsl_complex z0, z1, z2, z3;
912
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
913
- if (v->size < 5) {
914
- rb_raise(rb_eArgError, "the order of the object is less than 4.");
915
- }
916
- a4 = FUNCTION(gsl_vector,get)(v, 4);
917
- a3 = FUNCTION(gsl_vector,get)(v, 3)/a4;
918
- a2 = FUNCTION(gsl_vector,get)(v, 2)/a4; /* coefficients */
919
- a1 = FUNCTION(gsl_vector,get)(v, 1)/a4;
920
- a0 = FUNCTION(gsl_vector,get)(v, 0)/a4;
921
- n = gsl_poly_complex_solve_quartic(a3, a2, a1, a0, &z0, &z1, &z2, &z3);
922
- r = gsl_vector_complex_alloc(4);
923
- gsl_vector_complex_set(r, 0, z0);
924
- gsl_vector_complex_set(r, 1, z1);
925
- gsl_vector_complex_set(r, 2, z2);
926
- gsl_vector_complex_set(r, 3, z3);
927
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
928
- }
929
-
930
- #endif
931
-
932
- /* method */
933
- VALUE FUNCTION(rb_gsl_poly,complex_solve2)(int argc, VALUE *argv, VALUE obj)
934
- {
935
- GSL_TYPE(gsl_vector) *v = NULL;
936
- gsl_vector *a = NULL, *z = NULL;
937
- size_t size, size2, i;
938
- gsl_poly_complex_workspace *w = NULL;
939
- gsl_complex c;
940
- gsl_vector_complex *r = NULL;
941
- int flag = 0;
942
- // local variable "status" declared and set, but never used
943
- //int status;
944
-
945
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
946
- size = v->size;
947
- size2 = 2*(size - 1);
948
- z = gsl_vector_alloc(size2);
949
- a = gsl_vector_alloc(v->size);
950
- for (i = 0; i < v->size; i++) {
951
- gsl_vector_set(a, i, FUNCTION(gsl_vector,get)(v, i));
952
- }
953
- if (argc == 1 && rb_obj_is_kind_of(argv[0], cgsl_poly_workspace)) {
954
- Data_Get_Struct(argv[0], gsl_poly_complex_workspace, w);
955
- flag = 0;
956
- } else {
957
- w = gsl_poly_complex_workspace_alloc(size);
958
- flag = 1;
959
- }
960
- /*status =*/ gsl_poly_complex_solve(a->data, size, w, z->data);
961
-
962
- r = gsl_vector_complex_alloc(size - 1);
963
- for (i = 0; i < size - 1; i++) {
964
- c.dat[0] = gsl_vector_get(z, i*2);
965
- c.dat[1] = gsl_vector_get(z, i*2+1);
966
- gsl_vector_complex_set(r, i, c);
967
- }
968
- gsl_vector_free(a);
969
- gsl_vector_free(z);
970
- if (flag == 1) gsl_poly_complex_workspace_free(w);
971
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
972
- }
973
-
974
- #ifdef BASE_INT
975
- static VALUE rb_gsl_poly_int_to_f(VALUE obj)
976
- {
977
- gsl_vector *v;
978
- gsl_vector_int *vi;
979
- size_t i;
980
- Data_Get_Struct(obj, gsl_vector_int, vi);
981
- v = gsl_vector_alloc(vi->size);
982
- for (i = 0; i < v->size; i++)
983
- gsl_vector_set(v, i, (double) gsl_vector_int_get(vi, i));
984
- return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, v);
985
- }
986
- #endif
987
-
988
- #ifdef BASE_DOUBLE
989
- static VALUE rb_gsl_poly_to_i(VALUE obj)
990
- {
991
- gsl_vector *v;
992
- gsl_vector_int *vi;
993
- size_t i;
994
- Data_Get_Struct(obj, gsl_vector, v);
995
- vi = gsl_vector_int_alloc(v->size);
996
- for (i = 0; i < v->size; i++)
997
- gsl_vector_int_set(vi, i, (int) gsl_vector_get(v, i));
998
- return Data_Wrap_Struct(cgsl_poly_int, 0, gsl_vector_int_free, vi);
999
- }
1000
-
1001
- static VALUE FUNCTION(rb_gsl_poly,workspace_new)(VALUE klass, VALUE n)
1002
- {
1003
- gsl_poly_complex_workspace *w = NULL;
1004
- w = gsl_poly_complex_workspace_alloc(FIX2INT(n));
1005
- return Data_Wrap_Struct(klass, 0, gsl_poly_complex_workspace_free, w);
1006
- }
1007
-
1008
- /* singleton method of the class Poly */
1009
- static VALUE rb_gsl_poly_dd_init(VALUE obj, VALUE vxa, VALUE vya)
1010
- {
1011
- gsl_vector *xa = NULL, *ya = NULL;
1012
- gsl_poly *dd = NULL;
1013
- Data_Get_Struct(vxa, gsl_vector, xa);
1014
- Data_Get_Struct(vya, gsl_vector, ya);
1015
- dd = gsl_vector_alloc(xa->size);
1016
- gsl_poly_dd_init(dd->data, xa->data, ya->data, xa->size);
1017
- return Data_Wrap_Struct(cgsl_poly_dd, 0, gsl_vector_free, dd);
1018
- }
1019
-
1020
- static VALUE rb_gsl_poly_dd_eval(VALUE obj, VALUE xxa, VALUE xx)
1021
- {
1022
- gsl_vector *v = NULL;
1023
- gsl_matrix *m = NULL;
1024
- gsl_vector *dd = NULL, *xa, *vnew = NULL;
1025
- gsl_matrix *mnew = NULL;
1026
- VALUE x, ary;
1027
- size_t size, i, j;
1028
- Data_Get_Struct(obj, gsl_vector, dd);
1029
- CHECK_VECTOR(xxa);
1030
- Data_Get_Struct(xxa, gsl_vector, xa);
1031
- switch (TYPE(xx)) {
1032
- case T_FIXNUM:
1033
- case T_BIGNUM:
1034
- case T_FLOAT:
1035
- return rb_float_new(gsl_poly_dd_eval(dd->data, xa->data, dd->size,
1036
- NUM2DBL(xx)));
1037
- break;
1038
- case T_ARRAY:
1039
- size = RARRAY_LEN(xx);
1040
- ary = rb_ary_new2(size);
1041
- for (i = 0; i < size; i++) {
1042
- x = rb_ary_entry(xx, i);
1043
- Need_Float(x);
1044
- rb_ary_store(ary, i,
1045
- rb_float_new(gsl_poly_dd_eval(dd->data, xa->data,
1046
- dd->size, NUM2DBL(x))));
1047
- }
1048
- return ary;
1049
- break;
1050
- default:
1051
- if (VEC_P(xx)) {
1052
- Data_Get_Struct(xx, GSL_TYPE(gsl_vector), v);
1053
- size = v->size;
1054
- vnew = gsl_vector_alloc(v->size);
1055
- for (i = 0; i < size; i++) {
1056
- gsl_vector_set(vnew, i,
1057
- gsl_poly_dd_eval(dd->data, xa->data,
1058
- dd->size, FUNCTION(gsl_vector,get)(v, i)));
1059
- }
1060
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
1061
- } else if (MAT_P(xx)) {
1062
- Data_Get_Struct(xx, GSL_TYPE(gsl_matrix), m);
1063
- size = m->size1;
1064
- mnew = gsl_matrix_alloc(m->size1, m->size2);
1065
- for (i = 0; i < m->size1; i++) {
1066
- for (j = 0; j < m->size2; j++) {
1067
- gsl_matrix_set(mnew, i, j,
1068
- gsl_poly_dd_eval(dd->data, xa->data,
1069
- dd->size, gsl_matrix_get(m, i, j)));
1070
- }
1071
- }
1072
- return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
1073
- } else {
1074
- rb_raise(rb_eTypeError, "wrong argument type");
1075
- }
1076
- break;
1077
- }
1078
- return Qnil; /* never reach here */
1079
- }
1080
-
1081
- static VALUE rb_gsl_poly_dd_taylor(int argc, VALUE *argv, VALUE obj)
1082
- {
1083
- gsl_vector *dd = NULL;
1084
- gsl_vector *xa, *c = NULL, *w = NULL;
1085
- double xp;
1086
- size_t size;
1087
- int flag = 0;
1088
- Data_Get_Struct(obj, gsl_vector, dd);
1089
- switch (argc) {
1090
- case 2:
1091
- size = dd->size;
1092
- xp = NUM2DBL(argv[0]);
1093
- CHECK_VECTOR(argv[1]);
1094
- Data_Get_Struct(argv[1], gsl_vector, xa);
1095
- w = gsl_vector_alloc(size);
1096
- flag = 1;
1097
- break;
1098
- case 3:
1099
- xp = NUM2DBL(argv[0]);
1100
- CHECK_VECTOR(argv[1]);
1101
- Data_Get_Struct(argv[1], gsl_vector, xa);
1102
- if (TYPE(argv[2]) == T_FIXNUM) {
1103
- size = FIX2INT(argv[2]);
1104
- w = gsl_vector_alloc(size);
1105
- flag = 1;
1106
- } else {
1107
- CHECK_VEC(argv[2]);
1108
- Data_Get_Struct(argv[2], GSL_TYPE(gsl_vector), w);
1109
- size = dd->size;
1110
- }
1111
- break;
1112
- case 4:
1113
- Need_Float(argv[0]);
1114
- CHECK_VECTOR(argv[1]);
1115
- CHECK_FIXNUM(argv[2]);
1116
- CHECK_VECTOR(argv[3]);
1117
- xp = NUM2DBL(argv[0]);
1118
- Data_Get_Struct(argv[1], gsl_vector, xa);
1119
- size = FIX2INT(argv[2]);
1120
- Data_Get_Struct(argv[3], GSL_TYPE(gsl_vector), w);
1121
- break;
1122
- default:
1123
- rb_raise(rb_eArgError, "wrong number of arguments");
1124
- }
1125
- c = gsl_vector_alloc(size);
1126
- gsl_poly_dd_taylor(c->data, xp, dd->data, xa->data, size, w->data);
1127
- if (flag == 1) gsl_vector_free(w);
1128
- return Data_Wrap_Struct(cgsl_poly_taylor, 0, gsl_vector_free, c);
1129
- }
1130
-
1131
- #endif
1132
-
1133
- static VALUE FUNCTION(rb_gsl_poly,order)(VALUE obj)
1134
- {
1135
- GSL_TYPE(gsl_vector) *v = NULL;
1136
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1137
- return INT2FIX(v->size - 1);
1138
- }
1139
-
1140
- int FUNCTION(gsl_poly,conv)(const BASE *a, size_t na, const BASE *b, size_t nb,
1141
- BASE *c, size_t *nc)
1142
- {
1143
- BASE x;
1144
- size_t i, j;
1145
- *nc = na + nb - 1;
1146
- for (i = 0; i < *nc; i++) c[i] = 0;
1147
- for (i = 0; i < *nc; i++) {
1148
- if (i >= na) break;
1149
- x = a[i];
1150
- for (j = 0; j < *nc; j++) {
1151
- if (j >= nb) break;
1152
- else c[i+j] += x*b[j];
1153
- }
1154
- }
1155
- return 0;
1156
- }
1157
-
1158
- GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,conv_vector)(const GSL_TYPE(gsl_vector) *v1, const GSL_TYPE(gsl_vector) *v2)
1159
- {
1160
- GSL_TYPE(gsl_vector) *vnew = NULL;
1161
- size_t n, tmp;
1162
- if (v1->size == 1) {
1163
- vnew = FUNCTION(make_vector,clone)(v2);
1164
- FUNCTION(gsl_vector,scale)(vnew, FUNCTION(gsl_vector,get)(v1, 0));
1165
- return vnew;
1166
- } else if (v2->size == 1) {
1167
- vnew = FUNCTION(make_vector,clone)(v1);
1168
- FUNCTION(gsl_vector,scale)(vnew, FUNCTION(gsl_vector,get)(v2, 0));
1169
- return vnew;
1170
- } else {
1171
- n = v1->size + v2->size - 1;
1172
- vnew = FUNCTION(gsl_vector,calloc)(n);
1173
- FUNCTION(gsl_poly,conv)(v1->data, v1->size, v2->data, v2->size, vnew->data, &tmp);
1174
- return vnew;
1175
- }
1176
- }
1177
-
1178
- GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,reduce)(const GSL_TYPE(gsl_vector) *v)
1179
- {
1180
- size_t i, nn = v->size;
1181
- GSL_TYPE(gsl_vector) *vnew = NULL;
1182
- for (i = v->size-1; 0 <= (int) i; i--) {
1183
- if (!gsl_fcmp(FUNCTION(gsl_vector,get)(v, i), 0.0, 1e-10)) {
1184
- nn = i;
1185
- break;
1186
- }
1187
- }
1188
- if (nn == 0) nn = v->size;
1189
- vnew = FUNCTION(gsl_vector,alloc)(nn);
1190
- for (i = 0; i < nn; i++) {
1191
- FUNCTION(gsl_vector,set)(vnew, i, FUNCTION(gsl_vector,get)(v, i));
1192
- }
1193
- return vnew;
1194
- }
1195
-
1196
- GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,deriv)(const GSL_TYPE(gsl_vector) *v)
1197
- {
1198
- GSL_TYPE(gsl_vector) *vnew = NULL;
1199
- size_t i;
1200
- vnew = FUNCTION(gsl_vector,alloc)(v->size - 1);
1201
- for (i = 0; i < v->size - 1; i++) {
1202
- FUNCTION(gsl_vector,set)(vnew, i, FUNCTION(gsl_vector,get)(v, i+1)*(i+1));
1203
- }
1204
- return vnew;
1205
- }
1206
-
1207
- GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,integ)(const GSL_TYPE(gsl_vector) *v)
1208
- {
1209
- GSL_TYPE(gsl_vector) *vnew = NULL;
1210
- size_t i;
1211
- vnew = FUNCTION(gsl_vector,alloc)(v->size + 1);
1212
- FUNCTION(gsl_vector,set)(vnew, 0, 0.0);
1213
- for (i = 1; i < v->size + 1; i++) {
1214
- FUNCTION(gsl_vector,set)(vnew, i, FUNCTION(gsl_vector,get)(v, i-1)/i);
1215
- }
1216
- return vnew;
1217
- }
1218
-
1219
- GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,deconv_vector)(const GSL_TYPE(gsl_vector) *c, const GSL_TYPE(gsl_vector) *a,
1220
- GSL_TYPE(gsl_vector) **r)
1221
- {
1222
- GSL_TYPE(gsl_vector) *vnew = NULL, *a2 = NULL, *c2 = NULL, *vtmp = NULL;
1223
- GSL_TYPE(gsl_vector) *rtmp = NULL;
1224
- BASE x, y, z, aa;
1225
- size_t n, i, j, k, jj;
1226
- c2 = FUNCTION(gsl_poly,reduce)(c);
1227
- a2 = FUNCTION(gsl_poly,reduce)(a);
1228
- n = c2->size - a2->size + 1;
1229
- vnew = FUNCTION(gsl_vector,calloc)(n);
1230
- rtmp = FUNCTION(gsl_vector,alloc)(c2->size - 1);
1231
- aa = FUNCTION(gsl_vector,get)(a2, a2->size - 1);
1232
- FUNCTION(gsl_vector,set)(vnew, n-1, FUNCTION(gsl_vector,get)(c2, c2->size-1)/aa);
1233
- for (i = n - 2, k = 1; k < n; i--, k++) {
1234
- x = FUNCTION(gsl_vector,get)(c2, c2->size-1-k);
1235
- for (j = n-1;; j--) {
1236
- z = FUNCTION(gsl_vector,get)(vnew, j);
1237
- jj = c2->size-1-k-j;
1238
- //if (jj > k || jj < 0) continue;
1239
- if (jj <= k) {
1240
- y = FUNCTION(gsl_vector,get)(a2, jj);
1241
- x -= y*z;
1242
- }
1243
- if (j == 0) break;
1244
- }
1245
- FUNCTION(gsl_vector,set)(vnew, i, x/aa);
1246
- }
1247
- vtmp = FUNCTION(gsl_poly,conv_vector)(vnew, a2);
1248
- for (i = 0; i < rtmp->size; i++) {
1249
- x = FUNCTION(gsl_vector,get)(c2, i);
1250
- y = FUNCTION(gsl_vector,get)(vtmp, i);
1251
- FUNCTION(gsl_vector,set)(rtmp, i, x - y);
1252
- }
1253
- *r = FUNCTION(gsl_poly,reduce)(rtmp);
1254
- FUNCTION(gsl_vector,free)(rtmp);
1255
- FUNCTION(gsl_vector,free)(vtmp);
1256
- FUNCTION(gsl_vector,free)(c2);
1257
- FUNCTION(gsl_vector,free)(a2);
1258
- return vnew;
1259
- }
1260
-
1261
- GSL_TYPE(gsl_poly)* FUNCTION(get_poly,get)(VALUE obj, int *flag)
1262
- {
1263
- GSL_TYPE(gsl_poly) *p = NULL;
1264
- size_t i;
1265
- switch (TYPE(obj)) {
1266
- case T_ARRAY:
1267
- p = FUNCTION(gsl_vector,alloc)(RARRAY_LEN(obj));
1268
- for (i = 0; i < p->size; i++) FUNCTION(gsl_vector,set)(p, i, (BASE) NUM2DBL(rb_ary_entry(obj, i)));
1269
- *flag = 1;
1270
- break;
1271
- case T_FLOAT:
1272
- case T_FIXNUM:
1273
- p = FUNCTION(gsl_vector,alloc)(1);
1274
- FUNCTION(gsl_vector,set)(p, 0, (BASE) NUM2DBL(obj));
1275
- *flag = 1;
1276
- break;
1277
- default:
1278
- CHECK_VEC(obj);
1279
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), p);
1280
- *flag = 0;
1281
- break;
1282
- }
1283
- return p;
1284
- }
1285
-
1286
- static VALUE FUNCTION(rb_gsl_poly,conv)(VALUE obj, VALUE bb)
1287
- {
1288
- GSL_TYPE(gsl_vector) *v = NULL, *v2 = NULL, *vnew = NULL;
1289
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1290
- switch (TYPE(bb)) {
1291
- case T_FIXNUM:
1292
- case T_FLOAT:
1293
- vnew = FUNCTION(gsl_vector,alloc)(v->size);
1294
- FUNCTION(gsl_vector,memcpy)(vnew, v);
1295
- FUNCTION(gsl_vector,scale)(vnew, (BASE) NUM2DBL(bb));
1296
- break;
1297
- default:
1298
- CHECK_VEC(bb);
1299
- Data_Get_Struct(bb, GSL_TYPE(gsl_vector), v2);
1300
- vnew = FUNCTION(gsl_poly,conv_vector)(v, v2);
1301
- break;
1302
- }
1303
- return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
1304
- }
1305
-
1306
- VALUE FUNCTION(rb_gsl_poly,deconv)(VALUE obj, VALUE bb)
1307
- {
1308
- GSL_TYPE(gsl_poly) *v = NULL, *v2 = NULL, *vnew = NULL, *r = NULL;
1309
- int flag = 0;
1310
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1311
- switch (TYPE(bb)) {
1312
- case T_ARRAY:
1313
- v2 = FUNCTION(get_poly,get)(bb, &flag);
1314
- break;
1315
- case T_FLOAT:
1316
- case T_FIXNUM:
1317
- v2 = FUNCTION(gsl_vector,alloc)(1);
1318
- FUNCTION(gsl_vector,set)(v2, 0, (BASE) NUM2DBL(bb));
1319
- break;
1320
- default:
1321
- CHECK_VEC(bb);
1322
- Data_Get_Struct(bb, GSL_TYPE(gsl_vector), v2);
1323
- break;
1324
- }
1325
- vnew = FUNCTION(gsl_poly,deconv_vector)(v, v2, &r);
1326
- if (flag == 1) FUNCTION(gsl_vector,free)(v2);
1327
- if (FUNCTION(gsl_vector,isnull)(r))
1328
- return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
1329
- else
1330
- return rb_ary_new3(2, Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew),
1331
- Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), r));
1332
- }
1333
-
1334
- static VALUE FUNCTION(rb_gsl_poly,reduce)(VALUE obj)
1335
- {
1336
- GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
1337
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1338
- vnew = FUNCTION(gsl_poly,reduce)(v);
1339
- if (vnew == NULL) {
1340
- return Qnil;
1341
- } else if (vnew->size == 0) {
1342
- return Qnil;
1343
- } else if (FUNCTION(gsl_vector,isnull)(vnew)) {
1344
- return INT2FIX(0);
1345
- } else if (vnew->size == 1) {
1346
- return rb_float_new(FUNCTION(gsl_vector,get)(vnew, 0));
1347
- } else {
1348
- return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
1349
- }
1350
- return Qnil; /* never reach here */
1351
- }
1352
-
1353
- static VALUE FUNCTION(rb_gsl_poly,deriv)(VALUE obj)
1354
- {
1355
- GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
1356
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1357
- vnew = FUNCTION(gsl_poly,deriv)(v);
1358
- return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
1359
- }
1360
-
1361
- static VALUE FUNCTION(rb_gsl_poly,integ)(VALUE obj)
1362
- {
1363
- GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
1364
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1365
- vnew = FUNCTION(gsl_poly,integ)(v);
1366
- return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
1367
- }
1368
-
1369
- static VALUE FUNCTION(rb_gsl_poly,conv2)(VALUE klass, VALUE v1, VALUE v2)
1370
- {
1371
- GSL_TYPE(gsl_poly) *p1 = NULL, *p2 = NULL, *p3 = NULL;
1372
- int flag1 = 0, flag2 = 0;
1373
- size_t i;
1374
- VALUE ary;
1375
- p1 = FUNCTION(get_poly,get)(v1, &flag1);
1376
- p2 = FUNCTION(get_poly,get)(v2, &flag2);
1377
- p3 = FUNCTION(gsl_poly,conv_vector)(p1, p2);
1378
- if (flag1 == 1) FUNCTION(gsl_vector,free)(p1);
1379
- if (flag2 == 1) FUNCTION(gsl_vector,free)(p2);
1380
- if (flag1 == 1 && flag2 == 1) {
1381
- ary = rb_ary_new2(p3->size);
1382
- for (i = 0; i < p3->size; i++)
1383
- rb_ary_store(ary, i, C_TO_VALUE2(FUNCTION(gsl_vector,get)(p3, i)));
1384
- FUNCTION(gsl_vector,free)(p3);
1385
- return ary;
1386
- } else {
1387
- return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), p3);
1388
- }
1389
- }
1390
-
1391
- static VALUE FUNCTION(rb_gsl_poly,deconv2)(VALUE klass, VALUE v1, VALUE v2)
1392
- {
1393
- GSL_TYPE(gsl_poly) *p1 = NULL, *p2 = NULL;
1394
- GSL_TYPE(gsl_poly) *r = NULL, *vnew = NULL;
1395
- int flag1 = 0, flag2 = 0;
1396
- p1 = FUNCTION(get_poly,get)(v1, &flag1);
1397
- p2 = FUNCTION(get_poly,get)(v2, &flag2);
1398
- vnew = FUNCTION(gsl_poly,deconv_vector)(p1, p2, &r);
1399
- if (flag1 == 1) FUNCTION(gsl_vector,free)(p1);
1400
- if (flag2 == 1) FUNCTION(gsl_vector,free)(p2);
1401
- if (FUNCTION(gsl_vector,isnull)(r))
1402
- return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
1403
- else
1404
- return rb_ary_new3(2, Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew),
1405
- Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), r));
1406
- }
1407
-
1408
- GSL_TYPE(gsl_poly)* FUNCTION(gsl_poly,add)(const GSL_TYPE(gsl_poly) *a,
1409
- const GSL_TYPE(gsl_poly) *b)
1410
- {
1411
- GSL_TYPE(gsl_poly) *c = NULL;
1412
- const GSL_TYPE(gsl_poly) *longer;
1413
- size_t i, n;
1414
- if (a->size > b->size) {
1415
- c = FUNCTION(gsl_vector,alloc)(a->size);
1416
- longer = a;
1417
- } else {
1418
- c = FUNCTION(gsl_vector,alloc)(b->size);
1419
- longer = b;
1420
- }
1421
- n = GSL_MIN(a->size, b->size);
1422
- for (i = 0; i < n; i++) {
1423
- FUNCTION(gsl_vector,set)(c, i, FUNCTION(gsl_vector,get)(a, i) + FUNCTION(gsl_vector,get)(b, i));
1424
- }
1425
- for (i = n; i < c->size; i++)
1426
- FUNCTION(gsl_vector,set)(c, i, FUNCTION(gsl_vector,get)(longer, i));
1427
- return c;
1428
- }
1429
-
1430
- static VALUE FUNCTION(rb_gsl_poly,add)(VALUE obj, VALUE bb)
1431
- {
1432
- GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL, *vb = NULL;
1433
- BASE b;
1434
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1435
- switch (TYPE(bb)) {
1436
- case T_FLOAT:
1437
- case T_FIXNUM:
1438
- b = (BASE) NUM2DBL(bb);
1439
- vnew = FUNCTION(gsl_vector,alloc)(v->size);
1440
- FUNCTION(gsl_vector,memcpy)(vnew, v);
1441
- FUNCTION(gsl_vector,set)(vnew, 0, FUNCTION(gsl_vector,get)(v, 0) + b);
1442
- break;
1443
- default:
1444
- CHECK_VEC(bb);
1445
- Data_Get_Struct(bb, GSL_TYPE(gsl_vector), vb);
1446
- vnew = FUNCTION(gsl_poly,add)(v, vb);
1447
- }
1448
- return Data_Wrap_Struct(CLASS_OF(obj), 0, FUNCTION(gsl_vector,free), vnew);
1449
- }
1450
-
1451
- static VALUE rb_gsl_poly_uminus(VALUE obj);
1452
- static VALUE rb_gsl_poly_int_uminus(VALUE obj);
1453
- static VALUE FUNCTION(rb_gsl_poly,sub)(VALUE obj, VALUE bb)
1454
- {
1455
- switch (TYPE(bb)) {
1456
- case T_FLOAT:
1457
- case T_FIXNUM:
1458
- return FUNCTION(rb_gsl_poly,add)(obj, C_TO_VALUE2(-(BASE)NUM2DBL(bb)));
1459
- break;
1460
- default:
1461
- CHECK_VEC(bb);
1462
- return FUNCTION(rb_gsl_poly,add)(obj, FUNCTION(rb_gsl_poly,uminus)(bb));
1463
- break;
1464
- }
1465
- }
1466
-
1467
- static VALUE FUNCTION(rb_gsl_poly,uminus)(VALUE obj)
1468
- {
1469
- GSL_TYPE(gsl_poly) *p = NULL, *pnew = NULL;
1470
- size_t i;
1471
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), p);
1472
- pnew = FUNCTION(gsl_vector,alloc)(p->size);
1473
- for (i = 0; i < pnew->size; i++) FUNCTION(gsl_vector,set)(pnew, i, -FUNCTION(gsl_vector,get)(p, i));
1474
- return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), pnew);
1475
- }
1476
-
1477
- static VALUE FUNCTION(rb_gsl_poly,uplus)(VALUE obj)
1478
- {
1479
- return obj;
1480
- }
1481
-
1482
- static VALUE FUNCTION(rb_gsl_poly,coerce)(VALUE obj, VALUE other)
1483
- {
1484
- GSL_TYPE(gsl_vector) *vb;
1485
- switch (TYPE(other)) {
1486
- case T_FLOAT:
1487
- case T_FIXNUM:
1488
- vb = FUNCTION(gsl_vector,calloc)(1);
1489
- FUNCTION(gsl_vector,set)(vb, 0, (BASE) NUM2DBL(other));
1490
- return rb_ary_new3(2, Data_Wrap_Struct(CLASS_OF(obj), 0, FUNCTION(gsl_vector,free), vb),
1491
- obj);
1492
- break;
1493
- default:
1494
- CHECK_VEC(other);
1495
- return rb_ary_new3(3, other, obj);
1496
- break;
1497
- }
1498
- }
1499
-
1500
- static VALUE FUNCTION(rb_gsl_poly,to_gv)(VALUE obj)
1501
- {
1502
- GSL_TYPE(gsl_vector) *v, *vnew = NULL;
1503
- Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1504
- vnew = FUNCTION(make_vector,clone)(v);
1505
- return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
1506
- }
1507
-
1508
- static VALUE FUNCTION(rb_gsl_poly,companion_matrix)(VALUE obj)
1509
- {
1510
- GSL_TYPE(gsl_poly) *p = NULL;
1511
- BASE z;
1512
- gsl_matrix *m;
1513
- size_t i, j, size;
1514
- Data_Get_Struct(obj, GSL_TYPE(gsl_poly), p);
1515
- size = p->size - 1;
1516
- m = gsl_matrix_calloc(size, size);
1517
- z = FUNCTION(gsl_vector,get)(p, size);
1518
- for (j = 0; j < size; j++)
1519
- gsl_matrix_set(m, 0, size-j-1, -FUNCTION(gsl_vector,get)(p, j)/z);
1520
- for (i = 1; i < size; i++) {
1521
- gsl_matrix_set(m, i, i-1, 1.0);
1522
- }
1523
- return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, m);
1524
- }
1525
-
1526
- static VALUE FUNCTION(rb_gsl_poly,info)(VALUE obj)
1527
- {
1528
- GSL_TYPE(gsl_poly) *v;
1529
- char buf[256];
1530
- Data_Get_Struct(obj, GSL_TYPE(gsl_poly), v);
1531
- sprintf(buf, "Class: %s\n", rb_class2name(CLASS_OF(obj)));
1532
- sprintf(buf, "%sSuperClass: %s\n", buf, rb_class2name(RCLASS_SUPER(CLASS_OF(obj))));
1533
- sprintf(buf, "%sOrder: %d\n", buf, (int) v->size-1);
1534
- return rb_str_new2(buf);
1535
- }
1536
-
1537
- #ifdef BASE_DOUBLE
1538
- #include "include/rb_gsl_fit.h"
1539
- /* singleton */
1540
- static VALUE rb_gsl_poly_fit(int argc, VALUE *argv, VALUE obj)
1541
- {
1542
- gsl_multifit_linear_workspace *space = NULL;
1543
- gsl_matrix *X = NULL, *cov = NULL;
1544
- gsl_vector *x, *y = NULL, *c = NULL;
1545
- gsl_vector_view xx, yy;
1546
- size_t order, i, j;
1547
- double chisq, val;
1548
- int status, flag = 0;
1549
- VALUE vc, vcov;
1550
- if (argc != 3 && argc != 4)
1551
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
1552
- x = &xx.vector;
1553
- y = &yy.vector;
1554
- Data_Get_Vector(argv[0], x);
1555
- Data_Get_Vector(argv[1], y);
1556
- order = NUM2INT(argv[2]);
1557
- if (argc == 4) {
1558
- Data_Get_Struct(argv[3], gsl_multifit_linear_workspace, space);
1559
- } else {
1560
- space = gsl_multifit_linear_alloc(x->size, order + 1);
1561
- flag = 1;
1562
- }
1563
- cov = gsl_matrix_alloc(order + 1, order + 1);
1564
- c = gsl_vector_alloc(order + 1);
1565
- X = gsl_matrix_alloc(x->size, order + 1);
1566
- for (i = 0; i < x->size; i++) {
1567
- val = 1.0;
1568
- gsl_matrix_set(X, i, 0, val);
1569
- for (j = 1; j <= order; j++) {
1570
- val *= gsl_vector_get(x, i);
1571
- gsl_matrix_set(X, i, j, val);
1572
- }
1573
- }
1574
- status = gsl_multifit_linear(X, y, c, cov, &chisq, space);
1575
- if (flag == 1) gsl_multifit_linear_free(space);
1576
- vc = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, c);
1577
- vcov = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, cov);
1578
- gsl_matrix_free(X);
1579
- return rb_ary_new3(4, vc, vcov, rb_float_new(chisq), INT2FIX(status));
1580
- }
1581
-
1582
- static VALUE rb_gsl_poly_wfit(int argc, VALUE *argv, VALUE obj)
1583
- {
1584
- gsl_multifit_linear_workspace *space = NULL;
1585
- gsl_matrix *X = NULL, *cov = NULL;
1586
- gsl_vector *x, *y = NULL, *w, *c = NULL;
1587
- size_t order, i, j;
1588
- double chisq, val;
1589
- int status, flag = 0;
1590
- VALUE vc, vcov;
1591
- if (argc != 4 && argc != 5)
1592
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 4 or 5)", argc);
1593
- Data_Get_Vector(argv[0], x);
1594
- Data_Get_Vector(argv[1], w);
1595
- Data_Get_Vector(argv[2], y);
1596
- order = NUM2INT(argv[3]);
1597
- if (argc == 5) {
1598
- Data_Get_Struct(argv[4], gsl_multifit_linear_workspace, space);
1599
- } else {
1600
- space = gsl_multifit_linear_alloc(x->size, order + 1);
1601
- flag = 1;
1602
- }
1603
- cov = gsl_matrix_alloc(order + 1, order + 1);
1604
- c = gsl_vector_alloc(order + 1);
1605
- X = gsl_matrix_alloc(x->size, order + 1);
1606
- for (i = 0; i < x->size; i++) {
1607
- val = 1.0;
1608
- gsl_matrix_set(X, i, 0, val);
1609
- for (j = 1; j <= order; j++) {
1610
- val *= gsl_vector_get(x, i);
1611
- gsl_matrix_set(X, i, j, val);
1612
- }
1613
- }
1614
- status = gsl_multifit_wlinear(X, w, y, c, cov, &chisq, space);
1615
- if (flag == 1) gsl_multifit_linear_free(space);
1616
- vc = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, c);
1617
- vcov = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, cov);
1618
- gsl_matrix_free(X);
1619
- return rb_ary_new3(4, vc, vcov, rb_float_new(chisq), INT2FIX(status));
1620
- }
1621
- #endif
1622
-
1623
- #ifdef BASE_DOUBLE
1624
- static VALUE rb_gsl_poly_eval_derivs_singleton(int argc, VALUE *argv, VALUE klass)
1625
- {
1626
- VALUE ary;
1627
- gsl_vector *v = NULL, *v2 = NULL;
1628
- size_t i, lenc, lenres;
1629
-
1630
- if (argc < 2) rb_raise(rb_eArgError, "Wrong number of arguments (%d for >= 2)", argc);
1631
- if (rb_obj_is_kind_of(argv[0], rb_cArray)) {
1632
- v = gsl_vector_alloc(RARRAY_LEN(argv[0]));
1633
- lenc = v->size;
1634
- for (i = 0; i < lenc; i++) {
1635
- gsl_vector_set(v, i, NUM2DBL(rb_ary_entry(argv[0], i)));
1636
- }
1637
- if (argc == 2) lenres = lenc + 1;
1638
- else lenres = FIX2INT(argv[2]);
1639
- v2 = gsl_vector_alloc(lenres);
1640
- gsl_poly_eval_derivs(v->data, lenc, NUM2DBL(argv[1]), v2->data, lenres);
1641
- ary = rb_ary_new2(lenres);
1642
- for (i = 0; i < lenres; i++) {
1643
- rb_ary_store(ary, i, rb_float_new(gsl_vector_get(v2, i)));
1644
- }
1645
- gsl_vector_free(v2);
1646
- gsl_vector_free(v);
1647
- return ary;
1648
- }
1649
- if (rb_obj_is_kind_of(argv[0], cgsl_vector)) {
1650
- Data_Get_Struct(argv[0], gsl_vector, v);
1651
- lenc = v->size;
1652
- if (argc == 2) lenres = lenc + 1;
1653
- else lenres = FIX2INT(argv[2]);
1654
- v2 = gsl_vector_alloc(lenres);
1655
- gsl_poly_eval_derivs(v->data, lenc, NUM2DBL(argv[1]), v2->data, lenres);
1656
- return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, v2);
1657
- }
1658
- #ifdef HAVE_NARRAY_H
1659
- if (NA_IsNArray(argv[0])) {
1660
- struct NARRAY *na;
1661
- double *ptr1, *ptr2;
1662
- int shape[1];
1663
- GetNArray(argv[0], na);
1664
- ptr1 = (double*) na->ptr;
1665
- lenc = na->total;
1666
- if (argc == 2) lenres = lenc + 1;
1667
- else lenres = FIX2INT(argv[2]);
1668
- shape[0] = lenres;
1669
- ary = na_make_object(NA_DFLOAT, na->rank, shape, CLASS_OF(argv[0]));
1670
- ptr2 = NA_PTR_TYPE(ary,double*);
1671
- gsl_poly_eval_derivs(ptr1, lenc, NUM2DBL(argv[1]), ptr2, lenres);
1672
- return ary;
1673
- }
1674
- #endif
1675
- return Qnil; // Never comes here
1676
- }
1677
- static VALUE rb_gsl_poly_eval_derivs(int argc, VALUE *argv, VALUE obj)
1678
- {
1679
- gsl_vector *v, *v2;
1680
- size_t lenc, lenres;
1681
- Data_Get_Struct(obj, gsl_vector, v);
1682
- lenc = v->size;
1683
- switch (argc) {
1684
- case 1:
1685
- lenres = lenc + 1;
1686
- break;
1687
- case 2:
1688
- lenres = FIX2INT(argv[1]);
1689
- break;
1690
- default:
1691
- rb_raise(rb_eArgError, "Wrong number of arguments (%d for > 1)", argc);
1692
- }
1693
- v2 = gsl_vector_alloc(lenres);
1694
- gsl_poly_eval_derivs(v->data, lenc, NUM2DBL(argv[0]), v2->data, lenres);
1695
- return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, v2);
1696
- }
1697
- #endif
1698
-
1699
- void FUNCTION(Init_gsl_poly,init)(VALUE module)
1700
- {
1701
- #ifdef BASE_DOUBLE
1702
- VALUE mgsl_poly_complex;
1703
- cgsl_poly = rb_define_class_under(module, "Poly", cgsl_vector);
1704
- cgsl_poly_int = rb_define_class_under(cgsl_poly, "Int", cgsl_vector_int);
1705
-
1706
- cgsl_poly_workspace = rb_define_class_under(cgsl_poly, "Workspace", cGSL_Object);
1707
- mgsl_poly_complex = rb_define_module_under(cgsl_poly, "Complex");
1708
- cgsl_poly_complex_workspace = rb_define_class_under(mgsl_poly_complex,
1709
- "Workspace", cGSL_Object);
1710
- rb_define_singleton_method(cgsl_poly_workspace, "alloc",
1711
- rb_gsl_poly_workspace_new, 1);
1712
- rb_define_singleton_method(cgsl_poly_complex_workspace, "alloc",
1713
- rb_gsl_poly_workspace_new, 1);
1714
-
1715
- rb_define_singleton_method(mgsl_poly_complex, "solve_quadratic",
1716
- FUNCTION(rb_gsl_poly,complex_solve_quadratic), -1);
1717
- rb_define_singleton_method(mgsl_poly_complex, "solve_cubic",
1718
- FUNCTION(rb_gsl_poly,complex_solve_cubic), -1);
1719
- #ifdef HAVE_GSL_POLY_SOLVE_QUARTIC
1720
- rb_define_singleton_method(mgsl_poly_complex, "solve_quartic",
1721
- FUNCTION(rb_gsl_poly,complex_solve_quartic), -1);
1722
- #endif
1723
-
1724
- rb_define_singleton_method(mgsl_poly_complex, "solve",
1725
- FUNCTION(rb_gsl_poly,complex_solve), -1);
1726
- rb_define_singleton_method(mgsl_poly_complex, "roots",
1727
- FUNCTION(rb_gsl_poly,complex_solve), -1);
1728
- #endif
1729
-
1730
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_quadratic",
1731
- FUNCTION(rb_gsl_poly,solve_quadratic), -1);
1732
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_cubic",
1733
- FUNCTION(rb_gsl_poly,solve_cubic), -1);
1734
-
1735
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_quadratic",
1736
- FUNCTION(rb_gsl_poly,complex_solve_quadratic), -1);
1737
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_cubic",
1738
- FUNCTION(rb_gsl_poly,complex_solve_cubic), -1);
1739
- #ifdef HAVE_GSL_POLY_SOLVE_QUARTIC
1740
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_quartic",
1741
- FUNCTION(rb_gsl_poly,solve_quartic), -1);
1742
-
1743
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_quartic",
1744
- FUNCTION(rb_gsl_poly,complex_solve_quartic), -1);
1745
- #endif
1746
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve",
1747
- FUNCTION(rb_gsl_poly,complex_solve), -1);
1748
-
1749
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve",
1750
- FUNCTION(rb_gsl_poly,complex_solve), -1);
1751
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "roots",
1752
- FUNCTION(rb_gsl_poly,complex_solve), -1);
1753
-
1754
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "eval",
1755
- FUNCTION(rb_gsl_poly,eval2), -1);
1756
-
1757
- rb_define_method(GSL_TYPE(cgsl_poly), "eval",
1758
- FUNCTION(rb_gsl_poly,eval), 1);
1759
- rb_define_alias(GSL_TYPE(cgsl_poly), "at", "eval");
1760
-
1761
- rb_define_method(GSL_TYPE(cgsl_poly), "solve_quadratic",
1762
- FUNCTION(rb_gsl_poly,solve_quadratic2), 0);
1763
- rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_quadratic",
1764
- FUNCTION(rb_gsl_poly,complex_solve_quadratic2), 0);
1765
-
1766
- rb_define_method(GSL_TYPE(cgsl_poly), "solve_cubic",
1767
- FUNCTION(rb_gsl_poly,solve_cubic2), 0);
1768
- rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_cubic",
1769
- FUNCTION(rb_gsl_poly,complex_solve_cubic2), 0);
1770
-
1771
- #ifdef HAVE_GSL_POLY_SOLVE_QUARTIC
1772
- rb_define_method(GSL_TYPE(cgsl_poly), "solve_quartic",
1773
- FUNCTION(rb_gsl_poly,solve_quartic2), 0);
1774
- rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_quartic",
1775
- FUNCTION(rb_gsl_poly,complex_solve_quartic2), 0);
1776
- #endif
1777
-
1778
- rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve",
1779
- FUNCTION(rb_gsl_poly,complex_solve2), -1);
1780
- rb_define_alias(GSL_TYPE(cgsl_poly), "solve", "complex_solve");
1781
- rb_define_alias(GSL_TYPE(cgsl_poly), "roots", "complex_solve");
1782
-
1783
- #ifdef BASE_INT
1784
- rb_define_method(cgsl_poly_int, "to_f", rb_gsl_poly_int_to_f, 0);
1785
- #endif
1786
-
1787
- #ifdef BASE_DOUBLE
1788
- // rb_define_singleton_method(cgsl_poly, "eval", rb_gsl_poly_eval_singleton, 2);
1789
- rb_define_method(cgsl_poly, "to_i", rb_gsl_poly_to_i, 0);
1790
- rb_define_singleton_method(cgsl_poly, "complex_eval", rb_gsl_poly_eval_singleton, 2);
1791
- rb_define_method(cgsl_vector_complex, "eval", rb_gsl_complex_poly_complex_eval, 1);
1792
- cgsl_poly_dd = rb_define_class_under(cgsl_poly, "DividedDifference", cgsl_poly);
1793
- cgsl_poly_taylor = rb_define_class_under(cgsl_poly, "Taylor", cgsl_poly);
1794
- rb_define_singleton_method(cgsl_poly, "dd_init", rb_gsl_poly_dd_init, 2);
1795
-
1796
- rb_define_method(cgsl_poly_dd, "eval",rb_gsl_poly_dd_eval, 2);
1797
- rb_define_method(cgsl_poly_dd, "taylor", rb_gsl_poly_dd_taylor, -1);
1798
- #endif
1799
-
1800
- rb_define_method(GSL_TYPE(cgsl_poly), "order", FUNCTION(rb_gsl_poly,order), 0);
1801
-
1802
- /*****/
1803
- rb_define_method(GSL_TYPE(cgsl_poly), "conv", FUNCTION(rb_gsl_poly,conv), 1);
1804
- rb_define_alias(GSL_TYPE(cgsl_poly), "*", "conv");
1805
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "conv",
1806
- FUNCTION(rb_gsl_poly,conv2), 2);
1807
-
1808
- rb_define_method(GSL_TYPE(cgsl_poly), "deconv",
1809
- FUNCTION(rb_gsl_poly,deconv), 1);
1810
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "deconv",
1811
- FUNCTION(rb_gsl_poly,deconv2), 2);
1812
-
1813
- rb_define_method(GSL_TYPE(cgsl_poly), "reduce",
1814
- FUNCTION(rb_gsl_poly,reduce), 1);
1815
- rb_define_method(GSL_TYPE(cgsl_poly), "deriv", FUNCTION(rb_gsl_poly,deriv), 1);
1816
- rb_define_method(GSL_TYPE(cgsl_poly), "integ", FUNCTION(rb_gsl_poly,integ), 1);
1817
-
1818
- /*****/
1819
-
1820
- rb_define_method(GSL_TYPE(cgsl_poly), "add", FUNCTION(rb_gsl_poly,add), 1);
1821
- rb_define_alias(GSL_TYPE(cgsl_poly), "+", "add");
1822
- rb_define_method(GSL_TYPE(cgsl_poly), "sub", FUNCTION(rb_gsl_poly,sub), 1);
1823
- rb_define_alias(GSL_TYPE(cgsl_poly), "-", "sub");
1824
-
1825
- rb_define_method(GSL_TYPE(cgsl_poly), "-@", FUNCTION(rb_gsl_poly,uminus), 0);
1826
- rb_define_method(GSL_TYPE(cgsl_poly), "+@", FUNCTION(rb_gsl_poly,uplus), 0);
1827
-
1828
- rb_define_method(GSL_TYPE(cgsl_poly), "coerce",
1829
- FUNCTION(rb_gsl_poly,coerce), 1);
1830
- rb_define_method(GSL_TYPE(cgsl_poly), "to_gv", FUNCTION(rb_gsl_poly,to_gv), 0);
1831
- rb_define_alias(GSL_TYPE(cgsl_poly), "to_v", "to_gv");
1832
-
1833
- rb_define_method(GSL_TYPE(cgsl_poly), "companion_matrix",
1834
- FUNCTION(rb_gsl_poly,companion_matrix), 0);
1835
- rb_define_alias(GSL_TYPE(cgsl_poly), "compan", "companion_matrix");
1836
-
1837
- /*****/
1838
- rb_define_method(GSL_TYPE(cgsl_poly), "info",
1839
- FUNCTION(rb_gsl_poly,info), 0);
1840
-
1841
- #ifdef BASE_DOUBLE
1842
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "fit",
1843
- FUNCTION(rb_gsl_poly,fit), -1);
1844
- rb_define_singleton_method(GSL_TYPE(cgsl_poly), "wfit",
1845
- FUNCTION(rb_gsl_poly,wfit), -1);
1846
-
1847
- rb_define_singleton_method(cgsl_poly, "eval_derivs", rb_gsl_poly_eval_derivs_singleton, -1);
1848
- rb_define_method(cgsl_vector, "eval_derivs", rb_gsl_poly_eval_derivs, -1);
1849
-
1850
- #endif
1851
- }
1852
-
1853
- #undef NUMCONV
1854
- #undef NUMCONV2
1855
- #undef PRINTF_FORMAT
1856
- #undef VEC_ROW_COL
1857
- #undef VEC_P
1858
- #undef C_TO_VALUE
1859
- #undef C_TO_VALUE2
1860
- #undef VEC_COL_P
1861
- #undef VEC_ROW_P
1862
- #undef CHECK_VEC
1863
- #undef VEC_VIEW_P
1864
-
1865
- #undef MAT_ROW_COL
1866
- #undef MAT_P
1867
- #undef C_TO_VALUE
1868
- #undef MAT_COL_P
1869
- #undef MAT_ROW_P
1870
- #undef CHECK_MAT
1871
- #undef MAT_VIEW_P