RLPark 1.0.0
Reinforcement Learning Framework in Java

FileLogger.java

Go to the documentation of this file.
00001 package zephyr.plugin.core.api.internal.monitoring.fileloggers;
00002 
00003 import java.io.IOException;
00004 import java.io.Writer;
00005 import java.util.ArrayList;
00006 import java.util.List;
00007 
00008 import zephyr.plugin.core.api.internal.monitoring.abstracts.MonitoredDataTraverser;
00009 import zephyr.plugin.core.api.internal.monitoring.helpers.Parser;
00010 import zephyr.plugin.core.api.monitoring.abstracts.DataMonitor;
00011 import zephyr.plugin.core.api.monitoring.abstracts.Monitored;
00012 
00013 public class FileLogger extends AbstractFileLogger implements DataMonitor {
00014   private final List<String> labels = new ArrayList<String>();
00015   private final List<Monitored> loggeds = new ArrayList<Monitored>();
00016   private final List<Boolean> atLeastOneInfinite = new ArrayList<Boolean>();
00017   private final List<Boolean> atLeastOneNaN = new ArrayList<Boolean>();
00018   private final List<FileLogger> newclocks = new ArrayList<FileLogger>();
00019   private final boolean timeStamps;
00020   private boolean legendWrote = false;
00021 
00022   public FileLogger(String filepath) throws IOException {
00023     this(filepath, false, false);
00024   }
00025 
00026   public FileLogger(Writer writer) {
00027     this(writer, false);
00028   }
00029 
00030   public FileLogger(Writer writer, boolean timeStamps) {
00031     super(writer);
00032     this.timeStamps = timeStamps;
00033     init();
00034     legendWrote = true;
00035   }
00036 
00037   public FileLogger(String filepath, boolean timeStamps, boolean temporaryFile) throws IOException {
00038     super(filepath, temporaryFile);
00039     this.timeStamps = timeStamps;
00040     init();
00041   }
00042 
00043   private void init() {
00044     if (timeStamps)
00045       labels.add("LocalTime");
00046   }
00047 
00048   @Override
00049   public void add(String label, Monitored monitored) {
00050     labels.add(label);
00051     loggeds.add(monitored);
00052     atLeastOneInfinite.add(false);
00053     atLeastOneNaN.add(false);
00054   }
00055 
00056   public void add(Object toAdd) {
00057     add(toAdd, MonitoredDataTraverser.MonitorEverythingLevel);
00058   }
00059 
00060   public void add(Object toAdd, int levelRequired) {
00061     Parser.parse(this, toAdd, levelRequired);
00062   }
00063 
00064   public void update(long stepTime) {
00065     if (!legendWrote) {
00066       printLegend();
00067       legendWrote = true;
00068     }
00069     printValues(stepTime);
00070   }
00071 
00072   public void printLegend() {
00073     file.println(getLegend());
00074   }
00075 
00076   private void printValues(long stepTime) {
00077     String valuesLine = valuesToLine(stepTime);
00078     if (!valuesLine.isEmpty())
00079       file.println(valuesLine);
00080     file.flush();
00081   }
00082 
00083   private String valuesToLine(long stepTime) {
00084     StringBuilder line = new StringBuilder();
00085     if (timeStamps) {
00086       line.append(stepTime);
00087       line.append(" ");
00088     }
00089     for (int i = 0; i < loggeds.size(); i++) {
00090       double value = loggeds.get(i).monitoredValue();
00091       line.append(value);
00092       if (Double.isInfinite(value) && !atLeastOneInfinite.get(i)) {
00093         System.err.println(String.format("Warning: %s is infinite", labels.get(i)));
00094         atLeastOneInfinite.set(i, true);
00095       }
00096       if (Double.isNaN(value) && !atLeastOneNaN.get(i)) {
00097         System.err.println(String.format("Warning: %s is NaN", labels.get(i)));
00098         atLeastOneNaN.set(i, true);
00099       }
00100       if (i < loggeds.size() - 1)
00101         line.append(" ");
00102     }
00103     return line.toString();
00104   }
00105 
00106   private String getLegend() {
00107     StringBuilder legend = new StringBuilder();
00108     for (String label : labels)
00109       legend.append(label + " ");
00110     if (legend.length() == 0)
00111       return "";
00112     return legend.toString().substring(0, legend.length() - 1);
00113   }
00114 
00115   @Override
00116   public void close() {
00117     super.close();
00118     for (FileLogger logger : newclocks)
00119       logger.close();
00120   }
00121 
00122   public String[] getLabels() {
00123     String[] result = new String[labels.size()];
00124     labels.toArray(result);
00125     return result;
00126   }
00127 }
 All Classes Namespaces Files Functions Variables Enumerations
Zephyr
RLPark