statistics3 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Binary file
Binary file
data/ext/extconf.rb ADDED
@@ -0,0 +1,2 @@
1
+ require "mkmf"
2
+ create_makefile("_statistics3")
@@ -0,0 +1,525 @@
1
+ module Statistics3
2
+ module Base
3
+ SQ2PI = Math.sqrt(2 * Math::PI)
4
+
5
+ LOG_2PI = Math.log(2 * Math::PI) # log(2PI)
6
+ N = 8
7
+ B0 = 1.0
8
+ B1 = -1.0 / 2.0
9
+ B2 = 1.0 / 6.0
10
+ B4 = -1.0 / 30.0
11
+ B6 = 1.0 / 42.0
12
+ B8 = -1.0 / 30.0
13
+ B10 = 5.0 / 66.0
14
+ B12 = -691.0 / 2730.0
15
+ B14 = 7.0 / 6.0
16
+ B16 = -3617.0 / 510.0
17
+
18
+ # Newton approximation
19
+ def newton_a(y, ini, epsilon = 1.0e-6, limit = 30)
20
+ x = ini
21
+ limit.times do |i|
22
+ prev = x
23
+ f, df = yield(prev)
24
+ x = (y - f)/df + prev
25
+ if (x - prev).abs < epsilon
26
+ return x
27
+ end
28
+ end
29
+ $stderr.puts("Warning(newton approximation): over limit")
30
+ x
31
+ end
32
+
33
+ # Gamma function
34
+ def loggamma(x)
35
+ v = 1.0
36
+ while (x < N)
37
+ v *= x
38
+ x += 1.0
39
+ end
40
+ w = 1.0 / (x * x)
41
+ ret = B16 / (16 * 15)
42
+ ret = ret * w + B14 / (14 * 13)
43
+ ret = ret * w + B12 / (12 * 11)
44
+ ret = ret * w + B10 / (10 * 9)
45
+ ret = ret * w + B8 / ( 8 * 7)
46
+ ret = ret * w + B6 / ( 6 * 5)
47
+ ret = ret * w + B4 / ( 4 * 3)
48
+ ret = ret * w + B2 / ( 2 * 1)
49
+ ret = ret / x + 0.5 * LOG_2PI - Math.log(v) - x + (x - 0.5) * Math.log(x)
50
+ ret
51
+ end
52
+
53
+ def gamma(x)
54
+ if (x < 0.0)
55
+ return Math::PI / (Math.sin(Math.PI * x) * Math.exp(loggamma(1 - x))) #/
56
+ end
57
+ Math.exp(loggamma(x))
58
+ end
59
+
60
+ #normal-distribution
61
+ # (-\infty, z]
62
+ def p_nor(z)
63
+ if z < -12 then return 0.0 end
64
+ if z > 12 then return 1.0 end
65
+ if z == 0.0 then return 0.5 end
66
+
67
+ if z > 0.0
68
+ e = true
69
+ else
70
+ e = false
71
+ z = -z
72
+ end
73
+ z = z.to_f
74
+ z2 = z * z
75
+ t = q = z * Math.exp(-0.5 * z2) / SQ2PI
76
+
77
+ 3.step(199, 2) do |i|
78
+ prev = q
79
+ t *= z2 / i
80
+ q += t
81
+ if q <= prev
82
+ return(e ? 0.5 + q : 0.5 - q)
83
+ end
84
+ end
85
+ e ? 1.0 : 0.0
86
+ end
87
+
88
+ # inverse of normal distribution ([2])
89
+ # Pr( (-\infty, x] ) = qn -> x
90
+ def pnorm(qn)
91
+ b = [1.570796288, 0.03706987906, -0.8364353589e-3,
92
+ -0.2250947176e-3, 0.6841218299e-5, 0.5824238515e-5,
93
+ -0.104527497e-5, 0.8360937017e-7, -0.3231081277e-8,
94
+ 0.3657763036e-10, 0.6936233982e-12]
95
+
96
+ if(qn < 0.0 || 1.0 < qn)
97
+ $stderr.printf("Error : qn <= 0 or qn >= 1 in pnorm()!\n")
98
+ return 0.0;
99
+ end
100
+ qn == 0.5 and return 0.0
101
+
102
+ w1 = qn
103
+ qn > 0.5 and w1 = 1.0 - w1
104
+ w3 = -Math.log(4.0 * w1 * (1.0 - w1))
105
+ w1 = b[0]
106
+ 1.upto 10 do |i|
107
+ w1 += b[i] * w3**i;
108
+ end
109
+ qn > 0.5 and return Math.sqrt(w1 * w3)
110
+ -Math.sqrt(w1 * w3)
111
+ end
112
+
113
+ # Returns the integral of normal distribution over (-Infty, x].
114
+ def normaldist(z)
115
+ p_nor(z)
116
+ end
117
+
118
+ # Returns the P-value of normaldist(x).
119
+ def pnormaldist(y)
120
+ pnorm(y)
121
+ end
122
+
123
+ #chi-square distribution ([1])
124
+ #[x, \infty)
125
+ def q_chi2(df, chi2)
126
+ chi2 = chi2.to_f
127
+ if (df & 1) != 0
128
+ chi = Math.sqrt(chi2)
129
+ if (df == 1) then return 2 * normal___x(chi); end
130
+ s = t = chi * Math.exp(-0.5 * chi2) / SQ2PI
131
+ k = 3
132
+ while k < df
133
+ t *= chi2 / k; s += t;
134
+ k += 2
135
+ end
136
+ 2 * (normal___x(chi) + s)
137
+ else
138
+ s = t = Math.exp(-0.5 * chi2)
139
+ k = 2
140
+ while k < df
141
+ t *= chi2 / k; s += t;
142
+ k += 2
143
+ end
144
+ s
145
+ end
146
+ end
147
+
148
+ def chi2dens(n, x)
149
+ if n == 1
150
+ 1.0/Math.sqrt(2 * Math::PI * x) * Math::E**(-x/2.0)
151
+ elsif n == 2
152
+ 0.5 * Math::E**(-x/2.0)
153
+ else
154
+ n = n.to_f
155
+ n2 = n/2
156
+ x = x.to_f
157
+ 1.0 / 2**n2 / gamma(n2) * x**(n2 - 1.0) * Math.exp(-x/2.0)
158
+ end
159
+ end
160
+
161
+ # [x, \infty)
162
+ # Pr([x, \infty)) = y -> x
163
+ def pchi2(n, y)
164
+ if n == 1
165
+ w = pnorm(1 - y/2) # = pnormal___x(y/2)
166
+ w * w
167
+ elsif n == 2
168
+ # v = (1.0 / y - 1.0) / 33.0
169
+ # newton_a(y, v) {|x| [q_chi2(n, x), -chi2dens(n, x)] }
170
+ -2.0 * Math.log(y)
171
+ else
172
+ eps = 1.0e-5
173
+ v = 0.0
174
+ s = 10.0
175
+ loop do
176
+ v += s
177
+ if s <= eps then break end
178
+ if (qe = q_chi2(n, v) - y) == 0.0 then break end
179
+ if qe < 0.0
180
+ v -= s
181
+ s /= 10.0 #/
182
+ end
183
+ end
184
+ v
185
+ end
186
+ end
187
+
188
+ # Returns the integral of Chi-squared distribution with n degrees of freedom over [0, x].
189
+ def chi2dist(n, x); 1.0 - q_chi2(n, x); end
190
+
191
+ # Returns the P-value of chi2dist().
192
+ def pchi2dist(n, y); pchi2(n, 1.0 - y); end
193
+
194
+ # t-distribution ([1])
195
+ # (-\infty, x]
196
+ def p_t(df, t)
197
+ c2 = df.to_f / (df + t * t);
198
+ s = Math.sqrt(1.0 - c2)
199
+ s = -s if t < 0.0
200
+ p = 0.0;
201
+ i = df % 2 + 2
202
+ while i <= df
203
+ p += s
204
+ s *= (i - 1) * c2 / i
205
+ i += 2
206
+ end
207
+ if df & 1 != 0
208
+ 0.5+(p*Math.sqrt(c2)+Math.atan(t/Math.sqrt(df)))/Math::PI
209
+ else
210
+ (1.0 + p) / 2.0
211
+ end
212
+ end
213
+
214
+ # inverse of t-distribution ([2])
215
+ # (-\infty, -q/2] + [q/2, \infty)
216
+ def ptsub(q, n)
217
+ q = q.to_f
218
+ if(n == 1 && 0.001 < q && q < 0.01)
219
+ eps = 1.0e-4
220
+ elsif (n == 2 && q < 0.0001)
221
+ eps = 1.0e-4
222
+ elsif (n == 1 && q < 0.001)
223
+ eps = 1.0e-2
224
+ else
225
+ eps = 1.0e-5
226
+ end
227
+ s = 10000.0
228
+ w = 0.0
229
+ loop do
230
+ w += s
231
+ if(s <= eps) then return w end
232
+ if((qe = 2.0 - p_t(n, w)*2.0 - q) == 0.0) then return w end
233
+ if(qe < 0.0)
234
+ w -= s
235
+ s /= 10.0 #/
236
+ end
237
+ end
238
+ end
239
+
240
+ def pt(q, n)
241
+ q = q.to_f
242
+ if(q < 1.0e-5 || q > 1.0 || n < 1)
243
+ $stderr.printf("Error : Illigal parameter in pt()!\n")
244
+ return 0.0
245
+ end
246
+
247
+ if(n <= 5) then return ptsub(q, n) end
248
+ if(q <= 5.0e-3 && n <= 13) then return ptsub(q, n) end
249
+
250
+ f1 = 4.0 * (f = n.to_f)
251
+ f5 = (f4 = (f3 = (f2 = f * f) * f) * f) * f
252
+ f2 *= 96.0
253
+ f3 *= 384.0
254
+ f4 *= 92160.0
255
+ f5 *= 368640.0
256
+ u = pnormaldist(1.0 - q / 2.0)
257
+
258
+ w0 = (u2 = u * u) * u
259
+ w1 = w0 * u2
260
+ w2 = w1 * u2
261
+ w3 = w2 * u2
262
+ w4 = w3 * u2
263
+ w = (w0 + u) / f1
264
+ w += (5.0 * w1 + 16.0 * w0 + 3.0 * u) / f2
265
+ w += (3.0 * w2 + 19.0 * w1 + 17.0 * w0 - 15.0 * u) / f3
266
+ w += (79.0 * w3 + 776.0 * w2 + 1482.0 * w1 - 1920.0 * w0 - 9450.0 * u) / f4
267
+ w += (27.0 * w4 + 339.0 * w3 + 930.0 * w2 - 1782.0 * w1 - 765.0 * w0 + 17955.0 * u) / f5
268
+ u + w
269
+ end
270
+
271
+ # Returns the integral of t-distribution with n degrees of freedom over (-Infty, x].
272
+ def tdist(n, t); p_t(n, t); end
273
+
274
+ # Returns the P-value of tdist().
275
+ def ptdist(n, y)
276
+ if y > 0.5
277
+ pt(2.0 - y*2.0, n)
278
+ else
279
+ - pt(y*2.0, n)
280
+ end
281
+ end
282
+
283
+ # F-distribution ([1])
284
+ # [x, \infty)
285
+ def q_f(df1, df2, f)
286
+ if (f <= 0.0) then return 1.0; end
287
+ if (df1 % 2 != 0 && df2 % 2 == 0)
288
+ return 1.0 - q_f(df2, df1, 1.0 / f)
289
+ end
290
+ cos2 = 1.0 / (1.0 + df1.to_f * f / df2.to_f)
291
+ sin2 = 1.0 - cos2
292
+
293
+ if (df1 % 2 == 0)
294
+ prob = cos2 ** (df2.to_f / 2.0)
295
+ temp = prob
296
+ i = 2
297
+ while i < df1
298
+ temp *= (df2.to_f + i - 2) * sin2 / i
299
+ prob += temp
300
+ i += 2
301
+ end
302
+ return prob
303
+ end
304
+ prob = Math.atan(Math.sqrt(df2.to_f / (df1.to_f * f)))
305
+ temp = Math.sqrt(sin2 * cos2)
306
+ i = 3
307
+ while i <= df1
308
+ prob += temp
309
+ temp *= (i - 1).to_f * sin2 / i.to_f;
310
+ i += 2.0
311
+ end
312
+ temp *= df1.to_f
313
+ i = 3
314
+ while i <= df2
315
+ prob -= temp
316
+ temp *= (df1.to_f + i - 2) * cos2 / i.to_f
317
+ i += 2
318
+ end
319
+ prob * 2.0 / Math::PI
320
+ end
321
+
322
+ # inverse of F-distribution ([2])
323
+ def pfsub(x, y, z)
324
+ (Math.sqrt(z) - y) / x / 2.0
325
+ end
326
+
327
+ # [x, \infty)
328
+ def pf(q, n1, n2)
329
+ if(q < 0.0 || q > 1.0 || n1 < 1 || n2 < 1)
330
+ $stderr.printf("Error : Illegal parameter in pf()!\n")
331
+ return 0.0
332
+ end
333
+
334
+ if n1 <= 240 || n2 <= 240
335
+ eps = 1.0e-5
336
+ if(n2 == 1) then eps = 1.0e-4 end
337
+ fw = 0.0
338
+ s = 1000.0
339
+ loop do
340
+ fw += s
341
+ if s <= eps then return fw end
342
+ if (qe = q_f(n1, n2, fw) - q) == 0.0 then return fw end
343
+ if qe < 0.0
344
+ fw -= s
345
+ s /= 10.0 #/
346
+ end
347
+ end
348
+ end
349
+
350
+ eps = 1.0e-6
351
+ qn = q
352
+ if q < 0.5 then qn = 1.0 - q
353
+ u = pnorm(qn)
354
+ w1 = 2.0 / n1 / 9.0
355
+ w2 = 2.0 / n2 / 9.0
356
+ w3 = 1.0 - w1
357
+ w4 = 1.0 - w2
358
+ u2 = u * u
359
+ a = w4 * w4 - u2 * w2
360
+ b = -2. * w3 * w4
361
+ c = w3 * w3 - u2 * w1
362
+ d = b * b - 4 * a * c
363
+ if(d < 0.0)
364
+ fw = pfsub(a, b, 0.0)
365
+ else
366
+ if(a.abs > eps)
367
+ fw = pfsub(a, b, d)
368
+ else
369
+ if(b.abs > eps) then return -c / b end
370
+ fw = pfsub(a, b, 0.0)
371
+ end
372
+ end
373
+ fw * fw * fw
374
+ end
375
+ end
376
+
377
+ # Returns the integral of F-distribution with n1 and n2 degrees of freedom over [0, x].
378
+ def fdist(n1, n2, f); 1.0 - q_f(n1, n2, f); end
379
+
380
+ # Returns the P-value of fdist().
381
+ def pfdist(n1, n2, y); pf(1.0 - y, n1, n2); end
382
+
383
+ ############################################################################
384
+ # discrete distributions
385
+
386
+ def perm(n, x = n)
387
+ raise RangeError if n < 0 || x < 0
388
+ r = 1
389
+ while x >= 1
390
+ r *= n
391
+ n -= 1
392
+ x -= 1
393
+ end
394
+ r
395
+ end
396
+
397
+ def combi(n, x)
398
+ raise RangeError if n < 0 || x < 0
399
+ x = n - x if x*2 > n
400
+ perm(n, x) / perm(x, x)
401
+ end
402
+
403
+ def bindens(n, p, x)
404
+ p = p.to_f
405
+ q = 1.0 - p
406
+ combi(n, x) * p**x * q**(n - x)
407
+ end
408
+
409
+ def bindist(n, p, x)
410
+ (0..x).inject(0.0) do |s, k|
411
+ s + bindens(n, p, k)
412
+ end
413
+ end
414
+
415
+ def poissondens(m, x)
416
+ return 0.0 if x < 0
417
+ m = m.to_f
418
+ m ** x * Math::E ** (-m) / perm(x)
419
+ end
420
+
421
+ def poissondist(m, x)
422
+ (0..x).inject(0.0) do |s, k|
423
+ s + poissondens(m, k)
424
+ end
425
+ end
426
+
427
+ ############################################################################
428
+ # normal-distribution
429
+
430
+ # Returns the integral of normal distribution over (-Infty, x].
431
+ def normalxXX_(z); normaldist(z); end
432
+
433
+ # Returns the integral of normal distribution over [0, x].
434
+ def normal__X_(z); normaldist(z) - 0.5; end
435
+
436
+ # Returns the integral of normal distribution over [x, Infty).
437
+ def normal___x(z); 1.0 - normaldist(z); end
438
+
439
+ # Returns the integral of normal distribution over (-Infty, -x] + [x, Infty).
440
+ def normalx__x(z); 2.0 - normaldist(z) * 2.0; end
441
+
442
+ # inverse of normal-distribution
443
+
444
+ # Return the P-value of the corresponding integral.
445
+ def pnormalxXX_(z); pnormaldist(z); end
446
+
447
+ # Return the P-value of the corresponding integral.
448
+ def pnormal__X_(y); pnormalxXX_(y + 0.5); end
449
+
450
+ # Return the P-value of the corresponding integral.
451
+ def pnormal___x(y); pnormalxXX_(1.0 - y); end
452
+
453
+ # Return the P-value of the corresponding integral.
454
+ def pnormalx__x(y); pnormalxXX_(1.0 - y/2.0); end
455
+
456
+ # chi2-distribution
457
+
458
+ # Returns the integral of Chi-squared distribution with n degrees of freedom over [x, Infty).
459
+ def chi2_x(n, x); 1.0 - chi2dist(n, x); end
460
+
461
+ # Returns the integral of Chi-squared distribution with n degrees of freedom over [0, x].
462
+ def chi2X_(n, x); chi2dist(n, x); end
463
+
464
+ # inverse of chi2-distribution
465
+
466
+ # Return the P-value of the corresponding integral.
467
+ def pchi2_x(n, y); pchi2dist(n, 1.0 - y); end
468
+
469
+ # Return the P-value of the corresponding integral.
470
+ def pchi2X_(n, y); pchi2dist(n, y); end
471
+
472
+ # t-distribution
473
+
474
+ # Returns the integral of normal distribution with n degrees of freedom over (-Infty, -x] + [x, Infty).
475
+ def tx__x(n, x); 2.0 - tdist(n, x) * 2.0; end
476
+
477
+ # Returns the integral of t-distribution with n degrees of freedom over (-Infty, x].
478
+ def txXX_(n, x); tdist(n, x); end
479
+
480
+ # Returns the integral of t-distribution with n degrees of freedom over [0, x].
481
+ def t__X_(n, x); tdist(n, x) - 0.5; end
482
+
483
+ # Returns the integral of t-distribution with n degrees of freedom over [x, Infty).
484
+ def t___x(n, x); 1.0 - tdist(n, x); end
485
+
486
+ # inverse of t-distribution
487
+
488
+ # Return the P-value of the corresponding integral.
489
+ def ptx__x(n, y); ptdist(n, 1.0 - y / 2.0); end
490
+
491
+ # Return the P-value of the corresponding integral.
492
+ def ptxXX_(n, y); ptdist(n, y); end
493
+
494
+ # Return the P-value of the corresponding integral.
495
+ def pt__X_(n, y); ptdist(n, 0.5 + y); end
496
+
497
+ # Return the P-value of the corresponding integral.
498
+ def pt___x(n, y); ptdist(n, 1.0 - y); end
499
+
500
+ # F-distribution
501
+
502
+ # Returns the integral of F-distribution with n1 and n2 degrees of freedom over [x, Infty).
503
+ def f_x(n1, n2, x); 1.0 - fdist(n1, n2, x); end
504
+
505
+ # Returns the integral of F-distribution with n1 and n2 degrees of freedom over [0, x].
506
+ def fX_(n1, n2, x); fdist(n1, n2, x); end
507
+
508
+
509
+ # inverse of F-distribution
510
+
511
+ # Return the P-value of the corresponding integral.
512
+ def pf_x(n1, n2, x); pfdist(n1, n2, 1.0 - x); end
513
+
514
+ # Return the P-value of the corresponding integral.
515
+ def pfX_(n1, n2, x); pfdist(n1, n2, x); end
516
+
517
+ # discrete distributions
518
+ def binX_(n, p, x); bindist(n, p, x); end
519
+ def bin_x(n, p, x); bindist(n, 1.0 - p, n - x); end
520
+
521
+ def poissonX_(m, x); poissondist(m, x); end
522
+ def poisson_x(m, x); 1.0 - poissondist(m, x-1); end
523
+ end
524
+ end
525
+
@@ -0,0 +1,6 @@
1
+ # Indicate that we should skip loading of the C extension.
2
+ module Statistics3
3
+ NO_EXT = true
4
+ end
5
+
6
+ require 'statistics3'
@@ -0,0 +1,13 @@
1
+ require_relative 'statistics3/base'
2
+
3
+ module Statistics3
4
+ extend Base
5
+
6
+ if not defined? Statistics3::NO_EXT
7
+ begin
8
+ require '_statistics3'
9
+ extend Extension
10
+ rescue LoadError
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,103 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
4
+ # this file to always be loaded, without a need to explicitly require it in any
5
+ # files.
6
+ #
7
+ # Given that it is always loaded, you are encouraged to keep this file as
8
+ # light-weight as possible. Requiring heavyweight dependencies from this file
9
+ # will add to the boot time of your test suite on EVERY test run, even for an
10
+ # individual file that may not need all of that loaded. Instead, consider making
11
+ # a separate helper file that requires the additional dependencies and performs
12
+ # the additional setup, and require it from the spec files that actually need
13
+ # it.
14
+ #
15
+ # The `.rspec` file also contains a few flags that are not defaults but that
16
+ # users commonly want.
17
+ #
18
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
19
+ RSpec.configure do |config|
20
+ # rspec-expectations config goes here. You can use an alternate
21
+ # assertion/expectation library such as wrong or the stdlib/minitest
22
+ # assertions if you prefer.
23
+ config.expect_with :rspec do |expectations|
24
+ # This option will default to `true` in RSpec 4. It makes the `description`
25
+ # and `failure_message` of custom matchers include text for helper methods
26
+ # defined using `chain`, e.g.:
27
+ # be_bigger_than(2).and_smaller_than(4).description
28
+ # # => "be bigger than 2 and smaller than 4"
29
+ # ...rather than:
30
+ # # => "be bigger than 2"
31
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
32
+ end
33
+
34
+ # rspec-mocks config goes here. You can use an alternate test double
35
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
36
+ config.mock_with :rspec do |mocks|
37
+ # Prevents you from mocking or stubbing a method that does not exist on
38
+ # a real object. This is generally recommended, and will default to
39
+ # `true` in RSpec 4.
40
+ mocks.verify_partial_doubles = true
41
+ end
42
+
43
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
44
+ # have no way to turn it off -- the option exists only for backwards
45
+ # compatibility in RSpec 3). It causes shared context metadata to be
46
+ # inherited by the metadata hash of host groups and examples, rather than
47
+ # triggering implicit auto-inclusion in groups with matching metadata.
48
+ config.shared_context_metadata_behavior = :apply_to_host_groups
49
+
50
+ # The settings below are suggested to provide a good initial experience
51
+ # with RSpec, but feel free to customize to your heart's content.
52
+ =begin
53
+ # This allows you to limit a spec run to individual examples or groups
54
+ # you care about by tagging them with `:focus` metadata. When nothing
55
+ # is tagged with `:focus`, all examples get run. RSpec also provides
56
+ # aliases for `it`, `describe`, and `context` that include `:focus`
57
+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
58
+ config.filter_run_when_matching :focus
59
+
60
+ # Allows RSpec to persist some state between runs in order to support
61
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
62
+ # you configure your source control system to ignore this file.
63
+ config.example_status_persistence_file_path = "spec/examples.txt"
64
+
65
+ # Limits the available syntax to the non-monkey patched syntax that is
66
+ # recommended. For more details, see:
67
+ # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
68
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
69
+ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
70
+ config.disable_monkey_patching!
71
+
72
+ # This setting enables warnings. It's recommended, but in some cases may
73
+ # be too noisy due to issues in dependencies.
74
+ config.warnings = true
75
+
76
+ # Many RSpec users commonly either run the entire suite or an individual
77
+ # file, and it's useful to allow more verbose output when running an
78
+ # individual spec file.
79
+ if config.files_to_run.one?
80
+ # Use the documentation formatter for detailed output,
81
+ # unless a formatter has already been configured
82
+ # (e.g. via a command-line flag).
83
+ config.default_formatter = 'doc'
84
+ end
85
+
86
+ # Print the 10 slowest examples and example groups at the
87
+ # end of the spec run, to help surface which specs are running
88
+ # particularly slow.
89
+ config.profile_examples = 10
90
+
91
+ # Run specs in random order to surface order dependencies. If you find an
92
+ # order dependency and want to debug it, you can fix the order by providing
93
+ # the seed, which is printed after each run.
94
+ # --seed 1234
95
+ config.order = :random
96
+
97
+ # Seed global randomization in this process using the `--seed` CLI option.
98
+ # Setting this allows you to use `--seed` to deterministically reproduce
99
+ # test failures related to randomization by passing the same `--seed` value
100
+ # as the one that triggered the failure.
101
+ Kernel.srand config.seed
102
+ =end
103
+ end