/******************************************************************************* * Copyright 2012 Analog Devices, Inc. * * Licensed 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 com.analog.lyric.math; import java.util.Random; @Deprecated public class RandomPlus extends Random { /** * */ private static final long serialVersionUID = 1L; public int [] nextPermutation(int n) { int [] answer = new int[n]; for (int i = 0; i < n; i++) answer[i] = i+1; //Modern Fisher-Yates shuffle for (int i = n-1; i >= 0; i--) { int j = Math.abs(nextInt())%(i+1); int tmp = answer[i]; answer[i] = answer[j]; answer[j] = tmp; } return answer; } /** * @deprecated use {@link DimpleRandom#nextGamma} instead. */ @Deprecated public double nextGamma(double alpha, double theta) { int k = (int) Math.floor(alpha); double delta = alpha - k; double g = 0; if (delta > 0) { double nu = Math.exp(1)/(Math.exp(1)+delta); while (true) { double v0 = nextDouble(); double v1 = nextDouble(); double xi = 0; double eta = 0; if (v0 <= nu) { xi = Math.pow((v0/nu),(1.0/delta)); eta = v1 * Math.pow(xi,delta-1); } else { xi = 1.0 - Math.log((v0-nu)/(1-nu)); eta = v1*Math.exp(-xi); } if (eta <= Math.pow(xi,delta-1) * Math.exp(-xi)) { break; } g = xi; } } double un = 0; for (int i = 0; i < k; i++) un += Math.log(nextDouble()); g = theta * (g-un); return g; } public double [] nextDirichlet(double [] a) { int n = a.length; double [] r = new double[n]; double sum = 0; for (int i = 0; i < n; i++) { r[i] = nextGamma(a[i], 1); sum += r[i]; } for (int i = 0; i < n; i++) r[i]=r[i]/sum; return r; } }