integration 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
@@ -0,0 +1,23 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'autotest/restart'
4
+
5
+ # Autotest.add_hook :initialize do |at|
6
+ # at.extra_files << "../some/external/dependency.rb"
7
+ #
8
+ # at.libs << ":../some/external"
9
+ #
10
+ # at.add_exception 'vendor'
11
+ #
12
+ # at.add_mapping(/dependency.rb/) do |f, _|
13
+ # at.files_matching(/test_.*rb$/)
14
+ # end
15
+ #
16
+ # %w(TestA TestB).each do |klass|
17
+ # at.extra_class_map[klass] = "test/test_misc.rb"
18
+ # end
19
+ # end
20
+
21
+ # Autotest.add_hook :run_command do |at|
22
+ # system "rake build"
23
+ # end
File without changes
@@ -0,0 +1,3 @@
1
+ === 0.1.0 / 2011-08-23
2
+
3
+ * Get code from http://rubyforge.org/projects/integral/ and converted to a gem.
@@ -0,0 +1,9 @@
1
+ .autotest
2
+ History.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ lib/integration.rb
7
+ spec/integration_spec.rb
8
+ spec/spec.opts
9
+ spec/spec_helper.rb
@@ -0,0 +1,60 @@
1
+ = integration
2
+
3
+ * http://github.com/clbustos/integration
4
+
5
+ == DESCRIPTION:
6
+
7
+ Numerical integration for Ruby, with a simple interface
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Use only one method: Integration.integrate
12
+ * Rectangular, Trapezoidal, Simpson, Adaptive quadrature, Monte Carlo and Romberg integration methods available on pure Ruby.
13
+ * If available, uses Ruby/GSL QNG non-adaptive Gauss-Kronrod integration and QAG adaptive integration, with support for Infinity+ and Infinity-
14
+
15
+
16
+ == SYNOPSIS:
17
+
18
+ Integration.integrate(1,2,{:tolerance=>1e-10,:method=>:simpson}) {|x| x**2} => 2.333333
19
+
20
+ # Support for infinity bounds with GSL QAG adaptative integration
21
+
22
+ normal_pdf=lambda {|x| (1/Math.sqrt(2*Math::PI))*Math.exp(-(x**2/2))}
23
+ Integration.integrate(Integration::MInfinity, 0 , {:tolerance=>1e-10}, &normal_pdf) => 0.5
24
+ Integration.integrate(0, Integration::Infinity , {:tolerance=>1e-10}, &normal_pdf) => 0.5
25
+
26
+ == REQUIREMENTS:
27
+
28
+ * Ruby/GSL, for better performance and support for infinite bounds
29
+
30
+ == INSTALL:
31
+
32
+ gem install integration
33
+
34
+ == LICENSE:
35
+
36
+ Copyright (c) 2005 Beng
37
+ 2011 clbustos
38
+
39
+ Permission is hereby granted, free of charge, to any person obtaining a
40
+ copy of this software and associated documentation files (the "Software"),
41
+ to deal in the Software without restriction, including without limitation
42
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
43
+ and/or sell copies of the Software, and to permit persons to whom the
44
+ Software is furnished to do so, subject to the following conditions:
45
+
46
+ The above copyright notice and this permission notice shall be included in
47
+ all copies or substantial portions of the Software.
48
+
49
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
50
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
51
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
52
+ THE DEVELOPERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
53
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
54
+ OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
55
+ SOFTWARE.
56
+
57
+ Except as contained in this notice, the name of the Beng shall not
58
+ be used in advertising or otherwise to promote the sale, use or other dealings
59
+ in this Software without prior written authorization from Beng.
60
+
@@ -0,0 +1,23 @@
1
+ # -*- ruby -*-
2
+ $:.unshift(File.expand_path(File.dirname(__FILE__)+"/lib/"))
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require 'integration'
6
+ require 'rubyforge'
7
+ # Hoe.plugin :compiler
8
+ # Hoe.plugin :gem_prelude_sucks
9
+ Hoe.plugin :git
10
+ # Hoe.plugin :inline
11
+ # Hoe.plugin :racc
12
+ # Hoe.plugin :rubyforge
13
+
14
+ Hoe.spec 'integration' do
15
+ self.developer('Ben Gimpert', 'NO_EMAIL')
16
+ self.developer('Claudio Bustos', 'clbustos_at_gmail.com')
17
+ self.version=Integration::VERSION
18
+ self.extra_dev_deps << ["rspec",">=2.0"] << ["rubyforge",">=0"]
19
+
20
+ end
21
+ # git log --pretty=format:"*%s[%cn]" v0.5.0..HEAD >> History.txt
22
+ # vim: syntax=ruby
23
+
@@ -0,0 +1,340 @@
1
+ # Copyright (c) 2005 Beng (original code)
2
+ # 2011 clbustos
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a
5
+ # copy of this software and associated documentation files (the "Software"),
6
+ # to deal in the Software without restriction, including without limitation
7
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
+ # and/or sell copies of the Software, and to permit persons to whom the
9
+ # Software is furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17
+ # THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19
+ # OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ # SOFTWARE.
21
+ #
22
+ # Except as contained in this notice, the name of the Beng shall not
23
+ # be used in advertising or otherwise to promote the sale, use or other dealings
24
+ # in this Software without prior written authorization from Beng.
25
+
26
+ # Diverse integration methods
27
+ # Use Integration.integrate as wrapper to direct access to methods
28
+ #
29
+ # Method API
30
+ #
31
+
32
+ class Integration
33
+ VERSION = '0.1.0'
34
+ # Minus Infinity
35
+ MInfinity=:minfinity
36
+ # Infinity
37
+ Infinity=:infinity
38
+ class << self
39
+
40
+ # Create a method 'has_<library>' on Module
41
+ # which require a library and return true or false
42
+ # according to success of failure
43
+ def create_has_library(library) #:nodoc:
44
+ define_singleton_method("has_#{library}?") do
45
+ cv="@@#{library}"
46
+ if !class_variable_defined? cv
47
+ begin
48
+ require library.to_s
49
+ class_variable_set(cv, true)
50
+ rescue LoadError
51
+ class_variable_set(cv, false)
52
+ end
53
+ end
54
+ class_variable_get(cv)
55
+ end
56
+ end
57
+
58
+ # Rectangle method
59
+ # +n+ implies number of subdivisions
60
+ def rectangle(t1, t2, n)
61
+ total_area = 0
62
+ t = t1
63
+ dt = (t2 - t1) / n.to_f
64
+ dt_half = dt / 2
65
+
66
+ while (t + dt_half) <= t2
67
+ height = yield(t + dt_half)
68
+ area = dt * height
69
+ total_area += area
70
+ t += dt
71
+ end
72
+ return total_area
73
+
74
+ end
75
+ alias_method :midpoint, :rectangle
76
+
77
+ def trapezoid(t1, t2, n)
78
+ total_area = 0
79
+ t = t1
80
+ dt = (t2 - t1) / n.to_f
81
+ prev_height = nil
82
+ while (t + dt) <= t2
83
+ if prev_height.nil?
84
+ height1 = yield(t)
85
+ else
86
+ height1 = prev_height
87
+ end
88
+ height2 = yield(t + dt)
89
+ area = dt * ((height1 + height2) / 2)
90
+ total_area += area
91
+ t += dt
92
+ prev_height = height2
93
+ end
94
+ return total_area
95
+ end
96
+
97
+ def simpson(t1, t2, n)
98
+ n += 1 unless n % 2 == 0
99
+ dt = (t2.to_f - t1) / n
100
+ total_area = 0
101
+ (0..n).each do |i|
102
+ t = t1 + (dt * i)
103
+ if i.zero? || (i == n)
104
+ total_area += yield(t)
105
+ elsif i % 2 == 0
106
+ total_area += 2 * yield(t)
107
+ else
108
+ total_area += 4 * yield(t)
109
+ end
110
+ end
111
+ total_area *= dt / 3
112
+ return total_area
113
+ end
114
+
115
+ def adaptive_quadrature(a, b, tolerance)
116
+ h = (b.to_f - a) / 2
117
+ fa = yield(a)
118
+ fc = yield(a + h)
119
+ fb = yield(b)
120
+ s = h * (fa + (4 * fc) + fb) / 3
121
+ helper = Proc.new { |a, b, fa, fb, fc, h, s, level|
122
+ if level < 1/tolerance.to_f
123
+ fd = yield(a + (h / 2))
124
+ fe = yield(a + (3 * (h / 2)))
125
+ s1 = h * (fa + (4.0 * fd) + fc) / 6
126
+ s2 = h * (fc + (4.0 * fe) + fb) / 6
127
+ if ((s1 + s2) - s).abs <= tolerance
128
+ s1 + s2
129
+ else
130
+ helper.call(a, a + h, fa, fc, fd, h / 2, s1, level + 1) +
131
+ helper.call(a + h, b, fc, fb, fe, h / 2, s2, level + 1)
132
+ end
133
+ else
134
+ raise "Integral did not converge"
135
+ end
136
+ }
137
+ return helper.call(a, b, fa, fb, fc, h, s, 1)
138
+ end
139
+
140
+ def gauss(t1, t2, n)
141
+ case n
142
+ when 1
143
+ z = [0.0]
144
+ w = [2.0]
145
+ when 2
146
+ z = [-0.57735026919, 0.57735026919]
147
+ w = [1.0, 1.0]
148
+ when 3
149
+ z = [-0.774596669241, 0.0, 0.774596669241]
150
+ w = [0.555555555556, 0.888888888889, 0.555555555556]
151
+ when 4
152
+ z = [-0.861136311594, -0.339981043585, 0.339981043585, 0.861136311594]
153
+ w = [0.347854845137, 0.652145154863, 0.652145154863, 0.347854845137]
154
+ when 5
155
+ z = [-0.906179845939, -0.538469310106, 0.0, 0.538469310106, 0.906179845939]
156
+ w = [0.236926885056, 0.478628670499, 0.568888888889, 0.478628670499, 0.236926885056]
157
+ when 6
158
+ z = [-0.932469514203, -0.661209386466, -0.238619186083, 0.238619186083, 0.661209386466, 0.932469514203]
159
+ w = [0.171324492379, 0.360761573048, 0.467913934573, 0.467913934573, 0.360761573048, 0.171324492379]
160
+ when 7
161
+ z = [-0.949107912343, -0.741531185599, -0.405845151377, 0.0, 0.405845151377, 0.741531185599, 0.949107912343]
162
+ w = [0.129484966169, 0.279705391489, 0.381830050505, 0.417959183673, 0.381830050505, 0.279705391489, 0.129484966169]
163
+ when 8
164
+ z = [-0.960289856498, -0.796666477414, -0.525532409916, -0.183434642496, 0.183434642496, 0.525532409916, 0.796666477414, 0.960289856498]
165
+ w = [0.10122853629, 0.222381034453, 0.313706645878, 0.362683783378, 0.362683783378, 0.313706645878, 0.222381034453, 0.10122853629]
166
+ when 9
167
+ z = [-0.968160239508, -0.836031107327, -0.613371432701, -0.324253423404, 0.0, 0.324253423404, 0.613371432701, 0.836031107327, 0.968160239508]
168
+ w = [0.0812743883616, 0.180648160695, 0.260610696403, 0.31234707704, 0.330239355001, 0.31234707704, 0.260610696403, 0.180648160695, 0.0812743883616]
169
+ when 10
170
+ z = [-0.973906528517, -0.865063366689, -0.679409568299, -0.433395394129, -0.148874338982, 0.148874338982, 0.433395394129, 0.679409568299, 0.865063366689, 0.973906528517]
171
+ w = [0.0666713443087, 0.149451349151, 0.219086362516, 0.26926671931, 0.295524224715, 0.295524224715, 0.26926671931, 0.219086362516, 0.149451349151, 0.0666713443087]
172
+ else
173
+ raise "Invalid number of spaced abscissas #{n}, should be 1-10"
174
+ end
175
+ sum = 0
176
+ (0...n).each do |i|
177
+ t = ((t1.to_f + t2) / 2) + (((t2 - t1) / 2) * z[i])
178
+ sum += w[i] * yield(t)
179
+ end
180
+ return ((t2 - t1) / 2.0) * sum
181
+ end
182
+
183
+ def romberg(a, b, tolerance)
184
+ # NOTE one-based arrays are used for convenience
185
+
186
+ h = b.to_f - a
187
+ m = 1
188
+ close = 1
189
+ r = [[], [], [], [], [], [], [], [], [], [], [], [], []];
190
+ r[1][1] = (h / 2) * (yield(a) + yield(b))
191
+ j = 1
192
+ while j <= 11 && tolerance < close
193
+ j += 1
194
+ r[j][0] = 0
195
+ h /= 2
196
+ sum = 0
197
+ (1..m).each do |k|
198
+ sum += yield(a + (h * ((2 * k) - 1)))
199
+ end
200
+ m *= 2
201
+ r[j][1] = r[j-1][1] / 2 + (h * sum)
202
+ (1..j-1).each do |k|
203
+ r[j][k+1] = r[j][k] + ((r[j][k] - r[j-1][k]) / ((4 ** k) - 1))
204
+ end
205
+ close = (r[j][j] - r[j-1][j-1])
206
+ end
207
+ return r[j][j]
208
+ end
209
+
210
+ def monte_carlo(t1, t2, n)
211
+ width = (t2 - t1).to_f
212
+ height = nil
213
+ vals = []
214
+ n.times do
215
+ t = t1 + (rand() * width)
216
+ ft = yield(t)
217
+ height = ft if height.nil? || ft > height
218
+ vals << ft
219
+ end
220
+ area_ratio = 0
221
+ vals.each do |ft|
222
+ area_ratio += (ft / height.to_f) / n.to_f
223
+ end
224
+ return (width * height) * area_ratio
225
+ end
226
+ def is_infinite?(v)
227
+ v==Infinity or v==MInfinity
228
+ end
229
+ # Methods available on pure ruby
230
+ RUBY_METHOD=[:rectangle,:trapezoid,:simpson, :adaptive_quadrature , :gauss, :romberg, :monte_carlo]
231
+ # Methods available with Ruby/GSL library
232
+ GSL_METHOD=[:qng, :qag]
233
+ # Get the integral for a function +f+, with bounds +t1+ and
234
+ # +t2+ given a hash of +options+.
235
+ # If Ruby/GSL is available, you could use +Integration::Minfinity+
236
+ # and +Integration::Infinity+ as bounds. Method
237
+ # Options are
238
+ # [:tolerance] Maximum difference between real and calculated integral.
239
+ # Default: 1e-10
240
+ # [:initial_step] Initial number of subdivitions
241
+ # [:step] Subdivitions increment on each iteration
242
+ # [:method] Integration method.
243
+ # Methods are
244
+ # [:rectangle] for [:initial_step+:step*iteration] quadrilateral subdivisions
245
+ # [:trapezoid] for [:initial_step+:step*iteration] trapezoid-al subdivisions
246
+ # [:simpson] for [:initial_step+:step*iteration] parabolic subdivisions
247
+ # [:adaptive_quadrature] for recursive appoximations until error [tolerance]
248
+ # [:gauss] [:initial_step+:step*iteration] weighted subdivisons using translated -1 -> +1 endpoints
249
+ # [:romberg] extrapolation of recursion approximation until error < [tolerance]
250
+ # [:monte_carlo] make [:initial_step+:step*iteration] random samples, and check for above/below curve
251
+ # [:qng] GSL QNG non-adaptive Gauss-Kronrod integration
252
+ # [:qag] GSL QAG adaptive integration, with support for infinite bounds
253
+ def integrate(t1,t2,options=Hash.new, &f)
254
+ inf_bounds=(is_infinite?(t1) or is_infinite?(t2))
255
+ raise "No function passed" unless block_given?
256
+ raise "Non-numeric bounds" unless ((t1.is_a? Numeric) and (t2.is_a? Numeric)) or inf_bounds
257
+ if(inf_bounds)
258
+ lower_bound=t1
259
+ upper_bound=t2
260
+ options[:method]=:qag if options[:method].nil?
261
+ else
262
+ lower_bound = [t1, t2].min
263
+ upper_bound = [t1, t2].max
264
+ end
265
+ def_method=(has_gsl?) ? :qag : :simpson
266
+ default_opts={:tolerance=>1e-10, :initial_step=>16,:step=>16, :method=>def_method}
267
+ options=default_opts.merge(options)
268
+ if RUBY_METHOD.include? options[:method]
269
+ raise "Ruby methods doesn't support infinity bounds" if inf_bounds
270
+ integrate_ruby(lower_bound,upper_bound,options,&f)
271
+ elsif GSL_METHOD.include? options[:method]
272
+ integrate_gsl(lower_bound,upper_bound,options,&f)
273
+ else
274
+ raise "Unknown integration method \"#{options[:method]}\""
275
+ end
276
+ end
277
+ def integrate_gsl(lower_bound,upper_bound,options,&f)
278
+
279
+ f = GSL::Function.alloc(&f)
280
+ method=options[:method]
281
+ tolerance=options[:tolerance]
282
+
283
+ if(method==:qag)
284
+ w = GSL::Integration::Workspace.alloc()
285
+ if(is_infinite?(lower_bound) and is_infinite?(upper_bound))
286
+ #puts "ambos"
287
+ val=f.qagi([tolerance,0.0], 1000, w)
288
+ elsif is_infinite?(lower_bound)
289
+ #puts "inferior #{upper_bound}"
290
+ val=f.qagil(upper_bound, [tolerance, 0], w)
291
+ elsif is_infinite?(upper_bound)
292
+ #puts "superior"
293
+ val=f.qagiu(lower_bound, [tolerance, 0], w)
294
+ else
295
+
296
+ val=f.qag([lower_bound,upper_bound],[tolerance,0.0], GSL::Integration::GAUSS61, w)
297
+ end
298
+ elsif(method==:qng)
299
+ val=f.qng([lower_bound, upper_bound], [tolerance, 0.0])
300
+ else
301
+ raise "Unknown integration method \"#{method}\""
302
+ end
303
+ val[0]
304
+ end
305
+ def integrate_ruby(lower_bound,upper_bound,options,&f)
306
+ method=options[:method]
307
+ tolerance=options[:tolerance]
308
+ initial_step=options[:initial_step]
309
+ step=options[:step]
310
+
311
+ begin
312
+ method_obj = Integration.method(method.to_s.downcase)
313
+ rescue
314
+ raise "Unknown integration method \"#{method}\""
315
+ end
316
+ current_step=initial_step
317
+
318
+ if(method==:adaptive_quadrature or method==:romberg or method==:gauss)
319
+ if(method==:gauss)
320
+ initial_step=10 if initial_step>10
321
+ tolerance=initial_step
322
+ end
323
+ method_obj.call(lower_bound, upper_bound, tolerance, &f)
324
+ else
325
+ #puts "iniciando"
326
+ value=method_obj.call(lower_bound, upper_bound, current_step, &f)
327
+ previous=value+(tolerance*2)
328
+ while((previous-value).abs > tolerance) do
329
+ #puts(value)
330
+ #puts(current_step)
331
+ current_step+=step
332
+ previous=value
333
+ value=method_obj.call(lower_bound, upper_bound, current_step, &f)
334
+ end
335
+ value
336
+ end
337
+ end
338
+ end
339
+ create_has_library :gsl
340
+ end
@@ -0,0 +1,60 @@
1
+ require File.expand_path(File.dirname(__FILE__)+"/spec_helper.rb")
2
+ describe Integration do
3
+ it "should respond integration based on ruby methods" do
4
+ a=lambda {|x| x**2}
5
+ # Integration over [1,2]=x^3/3=7/3
6
+
7
+ methods=[:rectangle,:trapezoid, :simpson, :adaptive_quadrature, :romberg]
8
+ methods.each do |m|
9
+ Integration.integrate(1,2,{:method=>m,:tolerance=>1e-7},&a).should be_within(1e-6).of(7/3.0)
10
+ end
11
+
12
+ end
13
+
14
+ it "should return a correct value for a complex integration with ruby methods" do
15
+ normal_pdf=lambda {|x| (1/Math.sqrt(2*Math::PI))*Math.exp(-(x**2/2))}
16
+ Integration.integrate(0,1,{:tolerance=>1e-12,:method=>:simpson},&normal_pdf).should be_within(1e-11).of(0.341344746068)
17
+ Integration.integrate(0,1,{:tolerance=>1e-12,:method=>:adaptive_quadrature},&normal_pdf).should be_within(1e-11).of(0.341344746068)
18
+ end
19
+ it "should return a correct value for a complex integration with gsl methods" do
20
+ normal_pdf=lambda {|x| (1/Math.sqrt(2*Math::PI))*Math.exp(-(x**2/2))}
21
+ Integration.integrate(0,1,{:tolerance=>1e-12,:method=>:qng},&normal_pdf).should be_within(1e-11).of(0.341344746068)
22
+ Integration.integrate(0,1,{:tolerance=>1e-12,:method=>:qag},&normal_pdf).should be_within(1e-11).of(0.341344746068)
23
+ end
24
+
25
+
26
+ it "should return correct integration for infinity bounds" do
27
+ if Integration.has_gsl?
28
+ normal_pdf=lambda {|x| (1/Math.sqrt(2*Math::PI))*Math.exp(-(x**2/2))}
29
+
30
+ Integration.integrate(Integration::MInfinity, Integration::Infinity,{:tolerance=>1e-10}, &normal_pdf).should be_within(1e-09).of(1)
31
+ else
32
+ pending("GSL not available")
33
+ end
34
+ end
35
+ it "should return correct integration for infinity lower bound" do
36
+ if Integration.has_gsl?
37
+ normal_pdf=lambda {|x| (1/Math.sqrt(2*Math::PI))*Math.exp(-(x**2/2))}
38
+
39
+ Integration.integrate(Integration::MInfinity, 0 , {:tolerance=>1e-10}, &normal_pdf).should be_within(1e-09).of(0.5)
40
+
41
+ else
42
+ pending("GSL not available")
43
+ end
44
+ end
45
+ it "should return correct integration for infinity upper bound" do
46
+ if Integration.has_gsl?
47
+
48
+ normal_pdf=lambda {|x| (1/Math.sqrt(2*Math::PI))*Math.exp(-(x**2/2))}
49
+ Integration.integrate(0,Integration::Infinity,{:tolerance=>1e-10}, &normal_pdf).should be_within(1e-09).of(0.5)
50
+
51
+ else
52
+ pending("GSL not available")
53
+ end
54
+ end
55
+ it "should raise an error if a ruby methods is called with infinite bounds" do
56
+ normal_pdf=lambda {|x| (1/Math.sqrt(2*Math::PI))*Math.exp(-(x**2/2))}
57
+ lambda {Integration.integrate(0,Integration::Infinity,{:method=>:simpson}, &normal_pdf).should be_within(1e-09).of(0.5)}.should raise_exception()
58
+ end
59
+ end
60
+
@@ -0,0 +1,3 @@
1
+ --color
2
+ -f s
3
+ -b
@@ -0,0 +1,11 @@
1
+ $:.unshift(File.dirname(__FILE__)+"/../lib")
2
+ begin
3
+ require 'simplecov'
4
+ SimpleCov.start do
5
+ add_filter "/spec/"
6
+ add_group "Libraries", "lib"
7
+ end
8
+ rescue LoadError
9
+ end
10
+ require 'rspec'
11
+ require 'integration'
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: integration
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Ben Gimpert
9
+ - Claudio Bustos
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain:
13
+ - |
14
+ -----BEGIN CERTIFICATE-----
15
+ MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MREwDwYDVQQDDAhjbGJ1
16
+ c3RvczEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
17
+ MB4XDTEwMDMyOTIxMzg1NVoXDTExMDMyOTIxMzg1NVowPzERMA8GA1UEAwwIY2xi
18
+ dXN0b3MxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
19
+ bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf8JVMGqE7m5kYb+PNN
20
+ neZv2pcXV5fQCi6xkyG8bi2/SIFy/LyxuvLzEeOxBeaz1Be93bayIUquOIqw3dyw
21
+ /KXWa31FxuNuvAm6CN8fyeRYX/ou4cw3OIUUnIvB7RMNIu4wbgeM6htV/QEsNLrv
22
+ at1/mh9JpqawPrcjIOVMj4BIp67vmzJCaUf+S/H2uYtSO09F+YQE3tv85TPeRmqU
23
+ yjyXyTc/oJiw1cXskUL8UtMWZmrwNLHXuZWWIMzkjiz3UNdhJr/t5ROk8S2WPznl
24
+ 0bMy/PMIlAbqWolRn1zl2VFJ3TaXScbqImY8Wf4g62b/1ZSUlGrtnLNsCYXrWiso
25
+ UPUCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFGu9
26
+ rrJ1H64qRmNNu3Jj/Qjvh0u5MA0GCSqGSIb3DQEBBQUAA4IBAQCV0Unka5isrhZk
27
+ GjqSDqY/6hF+G2pbFcbWUpjmC8NWtAxeC+7NGV3ljd0e1SLfoyBj4gnFtFmY8qX4
28
+ K02tgSZM0eDV8TpgFpWXzK6LzHvoanuahHLZEtk/+Z885lFene+nHadkem1n9iAB
29
+ cs96JO9/JfFyuXM27wFAwmfHCmJfPF09R4VvGHRAvb8MGzSVgk2i06OJTqkBTwvv
30
+ JHJdoyw3+8bw9RJ+jLaNoQ+xu+1pQdS2bb3m7xjZpufml/m8zFCtjYM/7qgkKR8z
31
+ /ZZt8lCiKfFArppRrZayE2FVsps4X6WwBdrKTMZ0CKSXTRctbEj1BAZ67eoTvBBt
32
+ rpP0jjs0
33
+ -----END CERTIFICATE-----
34
+
35
+ date: 2011-08-24 00:00:00 -03:00
36
+ default_executable:
37
+ dependencies:
38
+ - !ruby/object:Gem::Dependency
39
+ name: rspec
40
+ prerelease: false
41
+ requirement: &id001 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "2.0"
47
+ type: :development
48
+ version_requirements: *id001
49
+ - !ruby/object:Gem::Dependency
50
+ name: rubyforge
51
+ prerelease: false
52
+ requirement: &id002 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id002
60
+ - !ruby/object:Gem::Dependency
61
+ name: hoe
62
+ prerelease: false
63
+ requirement: &id003 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: "2.12"
69
+ type: :development
70
+ version_requirements: *id003
71
+ description: Numerical integration for Ruby, with a simple interface
72
+ email:
73
+ - NO_EMAIL
74
+ - clbustos_at_gmail.com
75
+ executables: []
76
+
77
+ extensions: []
78
+
79
+ extra_rdoc_files:
80
+ - History.txt
81
+ - Manifest.txt
82
+ - README.txt
83
+ files:
84
+ - .autotest
85
+ - History.txt
86
+ - Manifest.txt
87
+ - README.txt
88
+ - Rakefile
89
+ - lib/integration.rb
90
+ - spec/integration_spec.rb
91
+ - spec/spec.opts
92
+ - spec/spec_helper.rb
93
+ - .gemtest
94
+ has_rdoc: true
95
+ homepage: http://github.com/clbustos/integration
96
+ licenses: []
97
+
98
+ post_install_message:
99
+ rdoc_options:
100
+ - --main
101
+ - README.txt
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: "0"
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: "0"
116
+ requirements: []
117
+
118
+ rubyforge_project: integration
119
+ rubygems_version: 1.6.0
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: Numerical integration for Ruby, with a simple interface
123
+ test_files: []
124
+
@@ -0,0 +1 @@
1
+ �mV݈5�H�Ȗ�279s�Z�Q�eY�ڇ&����9CKy��*�p�����z�"��m�<����/��_��[!�6��a$mzj6`��Z���0�� 6��S