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

@return [Seecalc::PERT] object @param block PERT estimation block

# File lib/seecalc/pert.rb, line 38
def self.estimate(&block)
  calc = new
  calc.instance_eval(&block) if block_given?
  calc
end
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