public double[][] sampleGibbsClassificationsIG(double[] observations, double[][] parameters) {
Random ran = new Random();
double[][] observationClass = new double[observations.length][2];
Double[][] probabilities = new Double[parameters.length][2];
double[] IGparams = new double[2];
Double constant = 0.0;
double random = 0.0;
for (int i = 0; i < observations.length; i++) {
random = ran.nextDouble();
observationClass[i][0] = observations[i];
for (int k = 0; k < parameters.length; k++) {
IGparams[0] = parameters[k][0];
IGparams[1] = parameters[k][1];
probabilities[k][0] = (Double) (Distribution.computeIGDensityGeneral(observations[i], IGparams) * parameters[k][2]);
constant += probabilities[k][0];
//System.out.println("Probabilities: " + probabilities[k][0]);
}
//Comparator sorts the fields in descending order
Arrays.sort(probabilities, new DoubleArrayComparator(0));
//Look now if the argumentum minimum over the sequence of the sum of the probabilities ist smaller than the random draw.
for (int k = 0; k < parameters.length; k++) {
if (k == 0) {
probabilities[k][1] = probabilities[k][0] / constant;
} else {
probabilities[k][1] = probabilities[k - 1][1] + probabilities[k][0]/constant;
}
//System.out.println("Probability: " + probabilities[k][1] + " random number: " + random);
if(probabilities[k][1].compareTo((Double) random) >= 0) {
observationClass[i][1] = k;
break;
}
else continue;
}
constant = 0.0;
}
return observationClass;
}