class Seecalc::PERT
PERT
calculator Usage “`ruby require 'seecalc' Seecalc::PERT.estimate
do
pert 'object.1', o: 5, m: 8, p: 20 pert 'object.2', o: 3, m: 3, p: 6 pert 'object.3', o: 10, m: 12, p: 20 puts calculate
end “`
Attributes
items[R]
- Hash<Object>
Public Class Methods
estimate(&block)
click to toggle source
new()
click to toggle source
# File lib/seecalc/pert.rb, line 32 def initialize @items = {} end
Public Instance Methods
calculate()
click to toggle source
calculate E95%
# File lib/seecalc/pert.rb, line 45 def calculate calc_e95 end
pert(object, o:, m:, p:)
click to toggle source
Add new estimation @param o optimistic value @param m most usual value @param p pessimistic value
# File lib/seecalc/pert.rb, line 53 def pert(object, o:, m:, p:) raise "An attempt of adding a duplicate '#{object}'" if @items[object] e = calc_pert(o: o, m: m, p: p) @items[object] = { o: o, m: m, p: p }.merge(e) end
Protected Instance Methods
calc_e95()
click to toggle source
@param efforts [Array<Float>] @param rmserrs [Array<Float>] @return [Hash<>] effort, error and effort 95%
# File lib/seecalc/pert.rb, line 74 def calc_e95 # h.collect{|k, v| v[:b]}.inject(0, &:+) effort = @items.map { |_k, v| v[:effort] }.inject(0, &:+) errors = @items.map { |_k, v| v[:error] } error = Math.sqrt(errors.inject(0) { |sum, i| sum + i**2 }).round(2) { effort: effort, error: error, e95: (effort + 2 * error) } end
calc_pert(o:, m:, p:)
click to toggle source
@param o [Integer] optimistic esitmation @param m [Integer] most usual @param p [Integer] pessimistic @return [Hash<effort, rmserr>] average effort and root-mean-square error
# File lib/seecalc/pert.rb, line 65 def calc_pert(o:, m:, p:) effort = (o + m * 4 + p) / 6.0 error = (p - o) / 6.0 { effort: effort.round(2), error: error.round(2) } end