package edu.berkeley.cs.amplab.carat.android.storage;
import java.io.Serializable;
import edu.berkeley.cs.amplab.carat.android.CaratApplication;
import edu.berkeley.cs.amplab.carat.android.Constants;
/**
* Simple container class for Hog/Bug data to save memory.
* @author Eemil Lagerspetz
*
*/
public class SimpleHogBug implements Serializable, Comparable<SimpleHogBug>{
/**
* Auto-generated UID for serialization
*/
private static final long serialVersionUID = 8272459694607111058L;
private Constants.Type type = null;
public Constants.Type getType(){
return type;
}
public boolean isBug(){ return type == Constants.Type.BUG; }
public SimpleHogBug(String appName, Constants.Type type){
this.type = type;
if (type == Constants.Type.OS)
appPriority = CaratApplication.importanceString(Constants.IMPORTANCE_SUGGESTION);
this.appName = appName;
}
public SimpleHogBug(String appName, Constants.Type type, String priority){
this.type = type;
if (type == Constants.Type.OTHER)
appPriority = priority;
else if (type == Constants.Type.OS)
appPriority = CaratApplication.importanceString(Constants.IMPORTANCE_SUGGESTION);
this.appName = appName;
}
private String appName; // optional
/**
* @return the appName
*/
public String getAppName() {
return appName;
}
/**
* @param appName the appName to set
*/
public void setAppName(String appName) {
this.appName = appName;
}
/**
* @return the wDistance
*/
public double getwDistance() {
return wDistance;
}
/**
* @param wDistance the wDistance to set
*/
public void setwDistance(double wDistance) {
this.wDistance = wDistance;
}
/**
* @return the expectedValue
*/
public double getExpectedValue() {
return expectedValue;
}
/**
* @param expectedValue the expectedValue to set
*/
public void setExpectedValue(double expectedValue) {
this.expectedValue = expectedValue;
}
/**
* @return the expectedValueWithout
*/
public double getExpectedValueWithout() {
return expectedValueWithout;
}
/**
* @param expectedValueWithout the expectedValueWithout to set
*/
public void setExpectedValueWithout(double expectedValueWithout) {
this.expectedValueWithout = expectedValueWithout;
}
/**
* @return the appLabel
*/
public String getAppLabel() {
return appLabel;
}
/**
* @param appLabel the appLabel to set
*/
public void setAppLabel(String appLabel) {
this.appLabel = appLabel;
}
/**
* @return the appPriority
*/
public String getAppPriority() {
return appPriority;
}
/**
* @param appPriority the appPriority to set
*/
public void setAppPriority(String appPriority) {
this.appPriority = appPriority;
}
private double wDistance; // optional
private double expectedValue; // optional
private double expectedValueWithout; // optional
private String appLabel; // optional
private String appPriority; // optional
// error of with dist in %/s
private double error = 0;
// error of without dist in %/s
private double errorWithout = 0;
private int samples = -1;
private int samplesWithout = -1;
public double getError(){ return error;}
public void setError(double error){this.error = error;}
public double getErrorWithout(){ return errorWithout; }
public void setErrorWithout(double error){this.errorWithout = error;}
public int getSamples() {
return samples;
}
public void setSamples(double samples) {
this.samples = (int) samples;
}
public int getSamplesWithout() {
return samplesWithout;
}
public void setSamplesWithout(double samplesWithout) {
this.samplesWithout = (int) samplesWithout;
}
// overloaded method. note that one of them is static
public String getBenefitText() {
double ev = getExpectedValue();
double evWo = getExpectedValueWithout();
double error = getError();
double errorWo = getErrorWithout();
return getBenefitText(ev, error, evWo, errorWo);
}
public static String getBenefitText(double ev, double error, double evWo, double errorWo){
// Max battery life: What if the we swing entirely to the left end of the 95% error bar?
double blMax = 100.0/(ev - error);
double blMaxWo = 100.0/(evWo - errorWo);
// Min battery life
double blMin = 100.0/(ev + error);
double blMinWo = 100.0/(evWo + errorWo);
double ebMin = blMinWo - blMax;
double ebMax = blMaxWo - blMin;
double benefit = 100.0 / evWo - 100.0 / ev;
if (benefit < 0){
return null;
}
else{
double maxError = benefit - ebMin;
if (ebMax - benefit > maxError)
maxError = ebMax - benefit;
int min = (int) (benefit / 60);
int hours = (int) (min / 60);
// correct seconds value will be in benefit
benefit -= min * 60;
min -= hours * 60;
int errorMins = (int) (maxError / 60);
StringBuilder b = new StringBuilder();
if (hours > 0)
b.append(hours + "h ");
if (min > 0)
b.append(min + "m ");
if (hours <= 0){
b.append(((int) benefit)+ "s ");
}
b.append("\u00B1 ");
//int errorMins = (int) ((benefit - ebMin) / 60);
if (errorMins == 0)
b.append(((int) maxError) + "s");
else
b.append(errorMins + "m");
return b.toString();
}
}
public static String getErrorText(double ev, double error, double evWo, double errorWo){
// Max battery life: What if the we swing entirely to the left end of the 95% error bar?
double blMax = 100.0/(ev - error);
double blMaxWo = 100.0/(evWo - errorWo);
// Min battery life
double blMin = 100.0/(ev + error);
double blMinWo = 100.0/(evWo + errorWo);
double ebMin = blMinWo - blMax;
double ebMax = blMaxWo - blMin;
double benefit = 100.0 / evWo - 100.0 / ev;
int min = (int) (benefit / 60);
int hours = (int) (min / 60);
min -= hours * 60;
double maxError = benefit - ebMin;
if (ebMax - benefit > maxError)
maxError = ebMax - benefit;
int errorMins = (int) (maxError / 60);
if (errorMins == 0)
return ((int)maxError) + "s";
else
return errorMins + "m";
}
@Override
public int compareTo(SimpleHogBug another) {
double benefit = 100.0 / expectedValueWithout - 100.0 / expectedValue;
double benefit2 = 100.0 / another.expectedValueWithout - 100.0 / another.expectedValue;
double diff = benefit2 - benefit;
if (diff > 0)
return 1;
else if (diff < 0)
return -1;
else
return 0;
}
}