package de.fau.cs.jstk.app; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Arrays; import de.fau.cs.jstk.io.FrameInputStream; import de.fau.cs.jstk.io.FrameSource; public class Posteriors { public static final String SYNOPSIS = "usage: app.Posteriors file-list dir1 dir2 [ dir3 ... ]\n" + "Compute segment posteriors from individual logscores."; public static void main(String [] args) throws IOException { if (args.length < 3) { System.err.println(SYNOPSIS); System.err.println(Arrays.toString(args)); System.exit(1); } BufferedReader br = new BufferedReader(new FileReader(args[0])); String l; while ((l = br.readLine()) != null) { double [] logpsum = new double [args.length - 1]; int [] numf = new int [args.length - 1]; for (int i = 1; i < args.length; ++i) { FrameSource fr = new FrameInputStream(new File(args[i] + System.getProperty("file.separator") + l)); double [] lp = new double [fr.getFrameSize()]; if (lp.length != 1) throw new IOException(args[i] + " : not a lopg file! (dim > 1)"); while (fr.read(lp)) { logpsum[i-1] += lp[0]; numf[i-1]++; } } // compute logp double sum = 0.0; for (int i = 0; i < logpsum.length; ++i) sum += (logpsum[i] = Math.exp(logpsum[i] / (double) numf[i])); double mv = -Double.MAX_VALUE; int mp = 0; for (int i = 0; i < logpsum.length; ++i) { logpsum[i] /= sum; if (logpsum[i] > mv) { mv = logpsum[i]; mp = i; } } System.out.printf("%s %d %.5f", l, mp, mv); for (double d : logpsum) System.out.printf(" %.5f", d); System.out.println(); } } }