RLPark 1.0.0
Reinforcement Learning Framework in Java
|
00001 package zephyr.plugin.core.api.internal.logfiles; 00002 00003 import java.io.BufferedReader; 00004 import java.io.File; 00005 import java.io.IOException; 00006 import java.util.LinkedHashMap; 00007 import java.util.Map; 00008 import zephyr.plugin.core.api.labels.Labeled; 00009 import zephyr.plugin.core.api.monitoring.annotations.LabelProvider; 00010 import zephyr.plugin.core.api.monitoring.annotations.Monitor; 00011 00012 @Monitor 00013 public abstract class LogFile implements Labeled { 00014 protected BufferedReader reader; 00015 final public String filepath; 00016 private final double[] current; 00017 private final String[] labels; 00018 00019 public LogFile(String filepath) throws IOException { 00020 this.filepath = filepath; 00021 reader = getReader(filepath); 00022 labels = readLabels(); 00023 current = new double[labels.length]; 00024 } 00025 00026 @LabelProvider(ids = { "current" }) 00027 protected String labelOf(int i) { 00028 return labels[i]; 00029 } 00030 00031 public boolean eof() { 00032 if (reader == null) 00033 return true; 00034 boolean isReady = false; 00035 synchronized (reader) { 00036 try { 00037 if (reader != null) 00038 isReady = reader.ready(); 00039 } catch (IOException e) { 00040 e.printStackTrace(); 00041 } 00042 } 00043 return !isReady; 00044 } 00045 00046 abstract protected BufferedReader getReader(String filepath) throws IOException; 00047 00048 protected String[] readLabels() { 00049 String line = readLine(); 00050 while (line.startsWith("#") || line.startsWith(" ")) 00051 line = line.substring(1); 00052 String[] labels = line.split(" "); 00053 makeLabelsUnique(labels); 00054 return labels; 00055 } 00056 00057 private static void makeLabelsUnique(String[] labels) { 00058 Map<String, Integer> nbInstances = new LinkedHashMap<String, Integer>(); 00059 for (int i = 0; i < labels.length; i++) { 00060 Integer knownInstance = nbInstances.get(labels[i]); 00061 if (knownInstance != null) 00062 labels[i] = labels[i] + " (" + String.valueOf(knownInstance + 1) + ")"; 00063 else 00064 knownInstance = 0; 00065 knownInstance++; 00066 nbInstances.put(labels[i], knownInstance); 00067 } 00068 } 00069 00070 private String readDataLine() { 00071 if (reader == null) 00072 return null; 00073 String line = readLine(); 00074 if (line == null || line.startsWith("#")) 00075 return null; 00076 if (line.isEmpty()) 00077 return null; 00078 return line; 00079 } 00080 00081 00082 private String readLine() { 00083 String line = null; 00084 synchronized (reader) { 00085 try { 00086 line = reader.readLine(); 00087 } catch (IOException e) { 00088 e.printStackTrace(); 00089 close(); 00090 } 00091 } 00092 return line; 00093 } 00094 00095 public void step() { 00096 String line = null; 00097 while (!eof() && line == null) 00098 line = readDataLine(); 00099 if (line != null) 00100 lineToData(line); 00101 } 00102 00103 private void lineToData(String line) { 00104 assert line != null; 00105 String[] sarray = line.split(" "); 00106 for (int i = 0; i < Math.min(sarray.length, current.length); i++) 00107 try { 00108 current[i] = Double.valueOf(sarray[i]); 00109 } catch (Exception e) { 00110 } 00111 } 00112 00113 public static LogFile load(String filename) { 00114 try { 00115 if (filename.endsWith(".gz")) 00116 return new GZippedLogFile(filename); 00117 if (filename.endsWith(".bz2")) 00118 return new BZippedLogFile(filename); 00119 if (filename.endsWith(".zip")) 00120 return new ZippedLogFile(filename); 00121 return new TextLogFile(filename); 00122 } catch (IOException e) { 00123 e.printStackTrace(); 00124 return null; 00125 } 00126 } 00127 00128 public void close() { 00129 if (reader == null) 00130 return; 00131 synchronized (reader) { 00132 try { 00133 reader.close(); 00134 reader = null; 00135 } catch (IOException e) { 00136 e.printStackTrace(); 00137 } 00138 } 00139 } 00140 00141 @Override 00142 public String label() { 00143 String fileName = new File(filepath).getName(); 00144 int extensionIndex = fileName.indexOf("."); 00145 if (extensionIndex == -1) 00146 return fileName; 00147 return fileName.substring(0, extensionIndex); 00148 } 00149 00150 public double[] currentLine() { 00151 return current.clone(); 00152 } 00153 00154 public String[] labels() { 00155 return labels.clone(); 00156 } 00157 }