package test.beast.beast2vs1.trace;
import beast.core.BEASTObject;
import beast.core.Citation;
import beast.core.Description;
import beast.core.Input;
import beast.core.Input.Validate;
@Description("It is used by LogAnalyser. assertExpectation(TraceStatistics) sets TraceStatistics instance " +
"passed from LogAnalyser.initAndValidate(), and determines whether expectation is significantly different " +
"to statisctial mean considering stand error of mean. If true, then set isPassed = false, which makes JUnit " +
"test assertion failed.")
@Citation("Created by Walter Xie")
public class Expectation extends BEASTObject {
public Input<String> traceName = new Input<>("traceName", "The trace name of a loggable beastObject", Validate.REQUIRED);
public Input<Double> expValue =
new Input<>("expectedValue", "The expected value of the referred loggable beastObject", Validate.REQUIRED);
public Input<Double> standErrorOfMean =
new Input<>("stdError", "The expected standard error of mean. If not given, it will estimate error from log",
Validate.REQUIRED);
private boolean isPassed = true; // assert result
private boolean isValid = true; // assert ESS
private TraceStatistics trace;
// this constructor is used by Unit test
public Expectation(String traceName, Double expValue, Double stdError) throws Exception {
this.traceName.setValue(traceName, this);
this.expValue.setValue(expValue, this);
this.standErrorOfMean.setValue(stdError, this);
}
public boolean isPassed() {
return isPassed;
}
// public void setFailed(boolean failed) {
// isPassed = failed;
// }
public boolean isValid() {
return isValid;
}
public boolean assertExpectation(TraceStatistics trace, boolean displayStatistics) {
this.trace = trace;
double mean = trace.getMean();
double stderr = trace.getStdErrorOfMean();
double ess = trace.getESS();
double deltaMean = Math.abs(mean - expValue.get());
double deltaStdErr = Math.abs(2 * stderr + 2 * standErrorOfMean.get());
if (standErrorOfMean.get() == 0) {
isPassed = mean == expValue.get(); // used to check whether fixed value is fixed.
} else {
isPassed = deltaMean <= deltaStdErr;
isValid = ess > 100;
}
if (displayStatistics) {
System.out.println(traceName.get() + " : " + mean + " +- " + stderr + ", ESS = " + ess + ", expectation is "
+ expValue.get() + " +- " + standErrorOfMean.get());
}
return isPassed;
}
public TraceStatistics getTraceStatistics() {
return trace;
}
public double getStdError() {
return standErrorOfMean.get();
// double stderr = trace.getStdErrorOfMean();
// if (standErrorOfMean.get() != 0) {
// stderr = standErrorOfMean.get();
//// System.out.println("User defines standard error of mean = " + stderr);
// }
// return stderr;
}
@Override
public String toString() {
return traceName.get() + " " + expValue.get();
}
@Override
public void initAndValidate() {
// TODO Auto-generated method stub
}
}