/** * 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; } } }