/*
* Copyright (C) 2014 Mathias Unberath
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/
package edu.stanford.rsl.conrad.geometry.shapes.activeshapemodels;
/**
* Class to express a measure for the amount of principal components needed for the model to achieve the wanted variability.
* @author Mathias Unberath
*
*/
public class VarianceMeasure {
/**
* Contains the type of the measure.
*/
public String type;
/**
* Contains the value.
*/
public double val;
/**
* Constructs a measure for variation and sets the type name and its value.
* @param name The type of variation measure.
* @param val The value for the measure.
*/
public VarianceMeasure(String name, double val){
this.type = name;
this.val = val;
}
/**
* Default constructor.
*/
public VarianceMeasure(){
}
/**
* Sets the type name and its value.
* @param name The type of variation measure.
* @param val The value for the measure.
*/
public void setMeasure(String name, double val){
this.type = name;
this.val = val;
}
/**
* Evaluates the current variation measure with respect to the eigen values, i.e. variances passed to the method.
* @param variation The eigenvalues to be evaluated.
* @return The number of principal components to use.
*/
public int evaluate(double[] variation){
int dim = 0;
if(type.toLowerCase().equals("threshold")){
double sum = 0;
for(int i = 0; i < variation.length; i++){
sum += variation[i];
}
double[] var = new double[variation.length];
var[0] = variation[0] / sum;
for(int i = 1; i < variation.length; i++){
var[i] = var[i-1] + variation[i] / sum;
}
while(var[dim] < val){
dim++;
}
}else if(type.toLowerCase().equals("constant")){
dim = (int)val - 1;
}else{
System.out.println(type + " : Unsupported measure type. Using 95% threshold instead.");
this.type = "threshold";
this.val = 0.95;
dim = evaluate(variation) -1;
}
return dim+1;
}
}