Class: Saulabs::Gauss::TruncatedCorrection

Inherits:
Object
  • Object
show all
Defined in:
lib/saulabs/gauss/truncated_correction.rb

Class Method Summary collapse

Class Method Details

.exceeds_margin(perf_diff, draw_margin) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/saulabs/gauss/truncated_correction.rb', line 46

def exceeds_margin(perf_diff, draw_margin)
  abs_diff = perf_diff.abs
  denom = Distribution.cdf(draw_margin - abs_diff) - Distribution.cdf(-draw_margin - abs_diff)
  if denom < 2.2e-162
    return 1.0
  else
    v = v_exceeds_margin(abs_diff, draw_margin)
    return v**2 + 
           ((draw_margin - abs_diff) * Gauss::Distribution.standard.value_at(draw_margin - abs_diff) -
           (-draw_margin - abs_diff) * Gauss::Distribution.standard.value_at(-draw_margin - abs_diff)) / denom
  end
end

.v_exceeds_margin(perf_diff, draw_margin) ⇒ Object



41
42
43
44
# File 'lib/saulabs/gauss/truncated_correction.rb', line 41

def v_exceeds_margin(perf_diff, draw_margin)
  denom = Distribution.cdf(perf_diff - draw_margin)
  denom < 2.2e-162 ? -perf_diff + draw_margin : Gauss::Distribution.standard.value_at(perf_diff - draw_margin)/denom 
end

.v_within_margin(perf_diff, draw_margin) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'lib/saulabs/gauss/truncated_correction.rb', line 20

def v_within_margin(perf_diff, draw_margin)
  abs_diff = perf_diff.abs
  denom = Distribution.cdf(draw_margin - abs_diff) - Distribution.cdf(-draw_margin - abs_diff)
  if denom < 2.2e-162
    return perf_diff < 0 ? -perf_diff - draw_margin : -perf_diff + draw_margin
  end
  num = Gauss::Distribution.standard.value_at(-draw_margin - abs_diff) -
        Gauss::Distribution.standard.value_at(draw_margin - abs_diff)
  perf_diff < 0 ? -num/denom : num/denom
end

.w_exceeds_margin(perf_diff, draw_margin) ⇒ Object



31
32
33
34
35
36
37
38
39
# File 'lib/saulabs/gauss/truncated_correction.rb', line 31

def w_exceeds_margin(perf_diff, draw_margin)
  denom = Distribution.cdf(perf_diff - draw_margin)
  if denom < 2.2e-162
    return perf_diff < 0.0 ? 1.0 : 0.0
  else
    v = v_exceeds_margin(perf_diff, draw_margin)
    return v * (v + perf_diff - draw_margin)
  end
end

.w_within_margin(perf_diff, draw_margin) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/saulabs/gauss/truncated_correction.rb', line 7

def w_within_margin(perf_diff, draw_margin)
  abs_diff = perf_diff.abs
  denom = Distribution.cdf(draw_margin - abs_diff) - Distribution.cdf(-draw_margin - abs_diff)
  return 1.0 if denom < 2.2e-162
  vt = v_within_margin(abs_diff, draw_margin)
  return vt**2 + (
                  (draw_margin - abs_diff) * 
                  Gauss::Distribution.standard.value_at(draw_margin - abs_diff) -
                  (-draw_margin - abs_diff) *
                  Gauss::Distribution.standard.value_at(-draw_margin - abs_diff) 
                 ) / denom
end