blob: 8971d047437f6df56880b44c180ff4eb453696f9 [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.tools.rumen;
public class CDFPiecewiseLinearRandomGenerator extends CDFRandomGenerator {
/**
* @param cdf
* builds a CDFRandomValue engine around this
* {@link LoggedDiscreteCDF}, with a defaultly seeded RNG
*/
public CDFPiecewiseLinearRandomGenerator(LoggedDiscreteCDF cdf) {
super(cdf);
}
/**
* @param cdf
* builds a CDFRandomValue engine around this
* {@link LoggedDiscreteCDF}, with an explicitly seeded RNG
* @param seed
* the random number generator seed
*/
public CDFPiecewiseLinearRandomGenerator(LoggedDiscreteCDF cdf, long seed) {
super(cdf, seed);
}
/**
* TODO This code assumes that the empirical minimum resp. maximum is the
* epistomological minimum resp. maximum. This is probably okay for the
* minimum, because that likely represents a task where everything went well,
* but for the maximum we may want to develop a way of extrapolating past the
* maximum.
*/
@Override
public long valueAt(double probability) {
int rangeFloor = floorIndex(probability);
double segmentProbMin = getRankingAt(rangeFloor);
double segmentProbMax = getRankingAt(rangeFloor + 1);
long segmentMinValue = getDatumAt(rangeFloor);
long segmentMaxValue = getDatumAt(rangeFloor + 1);
// If this is zero, this object is based on an ill-formed cdf
double segmentProbRange = segmentProbMax - segmentProbMin;
long segmentDatumRange = segmentMaxValue - segmentMinValue;
long result = (long) ((probability - segmentProbMin) / segmentProbRange * segmentDatumRange)
+ segmentMinValue;
return result;
}
}