rb-gsl 1.16.0.5 → 1.16.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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