RLPark 1.0.0
Reinforcement Learning Framework in Java
|
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 }