package stoppers; import java.lang.*; import java.io.*; import main.BetterTokenizer; import java.math.*; import main.Cell; import main.GeneralInput; import main.Model; public class MetaStripeStop extends SimpleStop { SimpleStop [] stoppers = new SimpleStop[20]; int numStoppers=0; float sMin=0.2f; // higher is better float sDif=5f; // ratio between instripe and exstripe float threshold = (float) Math.exp(5.0); // should be exp(sDif) float interval=1f; boolean scoreTimeOnly = false; // in default mode score is multiple of integrated stripe score and time to lose stripe public MetaStripeStop() {} protected void loadParameter(String info, BetterTokenizer tokenizer) throws Exception { if(info.equals("Interval")) { GeneralInput.nextToken(tokenizer); interval = (float)tokenizer.nval; } else if(info.equals("StripeThreshold")) { GeneralInput.nextToken(tokenizer); sMin = (float)tokenizer.nval; } else if(info.equals("StripeDifference")) { GeneralInput.nextToken(tokenizer); sDif = (float)tokenizer.nval; threshold = (float) Math.exp((double) sDif); } else if(info.equals("ScoreTimeOnly")) { GeneralInput.nextToken(tokenizer); if(tokenizer.sval.equals("true")) scoreTimeOnly = true; } else if(info.equals("Stopper")) { StripeStop newStopper = new StripeStop(); newStopper.init(model); newStopper.loadParameters(tokenizer); newStopper.stopTime = this.stopTime; newStopper.sMin = this.sMin; newStopper.sDif = this.sDif; newStopper.threshold = this.threshold; stoppers[numStoppers++] = newStopper; System.out.println("MetaStripeStop: new stopper loaded"); } else super.loadParameter(info,tokenizer); } public boolean stop(float time) { boolean done = false; score = 0; if(time < lastTime + interval) { return false; } if(done) return true; if(time > stopTime) return done=true; for(int i = 0; i < numStoppers; i++) { if(stoppers[i].stop(time)) done = true; score += stoppers[i].getScore(); } score = score/numStoppers; cumScore += score * (time - lastTime); lastTime = time; if(done) { if(scoreTimeOnly) score = (-time); else score = -cumScore; return true; } else return false; } public void reset() { for(int i = 0; i < numStoppers; i++) stoppers[i].reset(); score = 0f; cumScore=0f; lastTime=0f; } public void initCells() { for(int i = 0; i < numStoppers; i++) stoppers[i].initCells(); } }