diff options
Diffstat (limited to 'estimation-scripts/EstimationResults.rb')
-rw-r--r-- | estimation-scripts/EstimationResults.rb | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/estimation-scripts/EstimationResults.rb b/estimation-scripts/EstimationResults.rb new file mode 100644 index 0000000..01eedcc --- /dev/null +++ b/estimation-scripts/EstimationResults.rb @@ -0,0 +1,100 @@ +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 + |