blob: 620b07a25a8380b0c221a6c3205883710823f40e [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.fs.slive;
import org.apache.hadoop.fs.slive.WeightSelector.Weightable;
/**
* Class to isolate the various weight algorithms we use.
*/
class Weights {
private Weights() {
}
/**
* A weight which always returns the same weight (1/3). Which will have an
* overall area of (1/3) unless otherwise provided.
*/
static class UniformWeight implements Weightable {
private static Double DEFAULT_WEIGHT = (1.0d / 3.0d);
private Double weight;
UniformWeight(double w) {
weight = w;
}
UniformWeight() {
this(DEFAULT_WEIGHT);
}
@Override // Weightable
public Double weight(int elapsed, int duration) {
return weight;
}
}
/**
* A weight which normalized the elapsed time and the duration to a value
* between 0 and 1 and applies the algorithm to form an output using the
* function (-2 * (x-0.5)^2) + 0.5 which initially (close to 0) has a value
* close to 0 and near input being 1 has a value close to 0 and near 0.5 has a
* value close to 0.5 (with overall area 0.3).
*/
static class MidWeight implements Weightable {
@Override // Weightable
public Double weight(int elapsed, int duration) {
double normalized = (double) elapsed / (double) duration;
double result = (-2.0d * Math.pow(normalized - 0.5, 2)) + 0.5d;
if (result < 0) {
result = 0;
}
if (result > 1) {
result = 1;
}
return result;
}
}
/**
* A weight which normalized the elapsed time and the duration to a value
* between 0 and 1 and applies the algorithm to form an output using the
* function (x)^2 which initially (close to 0) has a value close to 0 and near
* input being 1 has a value close to 1 (with overall area 1/3).
*/
static class EndWeight implements Weightable {
@Override // Weightable
public Double weight(int elapsed, int duration) {
double normalized = (double) elapsed / (double) duration;
double result = Math.pow(normalized, 2);
if (result < 0) {
result = 0;
}
if (result > 1) {
result = 1;
}
return result;
}
}
/**
* A weight which normalized the elapsed time and the duration to a value
* between 0 and 1 and applies the algorithm to form an output using the
* function (x-1)^2 which initially (close to 0) has a value close to 1 and
* near input being 1 has a value close to 0 (with overall area 1/3).
*/
static class BeginWeight implements Weightable {
@Override // Weightable
public Double weight(int elapsed, int duration) {
double normalized = (double) elapsed / (double) duration;
double result = Math.pow((normalized - 1), 2);
if (result < 0) {
result = 0;
}
if (result > 1) {
result = 1;
}
return result;
}
}
}