You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.0 KiB
101 lines
3.0 KiB
require 'Estimators'
|
|
require 'Sample'
|
|
|
|
class EstimationResults
|
|
|
|
attr_reader :estimator
|
|
|
|
def initialize(estimator, samples)
|
|
@samples = samples
|
|
@totalTime = samples.keys.max
|
|
@totalSize = @samples[@totalTime].bytesDownloaded + @samples[@totalTime].bytesLeft
|
|
@estimator = estimator
|
|
|
|
@maxError = nil
|
|
@estimations = nil
|
|
@absoluteErrors = nil
|
|
@relativeErrors = nil
|
|
@rootMeanSquareErrorRelative = nil
|
|
end
|
|
|
|
def getRootMeanSquareErrorRelative
|
|
if @rootMeanSquareErrorRelative == nil
|
|
relativeErrors = getRelativeErrors
|
|
@rootMeanSquareErrorRelative = 0.0
|
|
relativeErrors.each_value do |x|
|
|
@rootMeanSquareErrorRelative += x**2
|
|
end
|
|
@rootMeanSquareErrorRelative = Math.sqrt( @rootMeanSquareErrorRelative / relativeErrors.size )
|
|
end
|
|
return @rootMeanSquareErrorRelative
|
|
end
|
|
|
|
# returns the root mean square error for a specific interval of the download
|
|
# left and right must be floats between 0.0 (no bytes downloaded, start of download) and 1.0 (download complete), right must be greater than left
|
|
|
|
def getRootMeanSquareErrorRelative(left, right)
|
|
relativeErrors = getRelativeErrors
|
|
rmser = 0.0
|
|
|
|
n = 0
|
|
@samples.keys.each do |x|
|
|
percentage = @samples[x].bytesDownloaded.to_f / @totalSize
|
|
if percentage >= left and percentage <= right
|
|
rmser += relativeErrors[x]**2
|
|
n += 1
|
|
end
|
|
end
|
|
|
|
rmser = Math.sqrt( rmser / n )
|
|
|
|
return rmser
|
|
end
|
|
|
|
def getRelativeErrors
|
|
if @relativeErrors == nil
|
|
@relativeErrors = Hash.new
|
|
absoluteErrors = getAbsoluteErrors
|
|
absoluteErrors.keys.sort.each do |time|
|
|
timeLeft = @totalTime - time;
|
|
@relativeErrors[time] = absoluteErrors[time].abs.to_f / timeLeft
|
|
@relativeErrors[time] = @maxError if @maxError != nil and @relativeErrors[time] > @maxError
|
|
end
|
|
end
|
|
return @relativeErrors
|
|
end
|
|
|
|
def setMaxError(maxError)
|
|
if maxError != @maxError
|
|
@maxError = maxError
|
|
@relativeErrors = nil
|
|
@rootMeanSquareErrorRelative = nil
|
|
end
|
|
end
|
|
|
|
def getAbsoluteErrors
|
|
if @absoluteErrors == nil
|
|
@absoluteErrors = Hash.new
|
|
estimations = getEstimations
|
|
estimations.keys.sort.each do |time|
|
|
@absoluteErrors[time] = @estimations[time] - (@totalTime - time)
|
|
end
|
|
end
|
|
|
|
return @absoluteErrors
|
|
end
|
|
|
|
def getEstimations
|
|
|
|
if @estimations == nil
|
|
@estimations = Hash.new
|
|
@samples.values.sort.each do |sample|
|
|
@estimator.process(sample)
|
|
@estimations[sample.time] = @estimator.estimate
|
|
end
|
|
end
|
|
|
|
return @estimations
|
|
end
|
|
end
|
|
|