RLPark 1.0.0
Reinforcement Learning Framework in Java
|
00001 package rlpark.plugin.rltoys.experiments.parametersweep.internal; 00002 00003 import java.io.BufferedReader; 00004 import java.io.File; 00005 import java.io.FileInputStream; 00006 import java.io.IOException; 00007 import java.io.InputStreamReader; 00008 import java.util.ArrayList; 00009 import java.util.HashSet; 00010 import java.util.LinkedHashMap; 00011 import java.util.List; 00012 import java.util.Map; 00013 import java.util.Set; 00014 00015 import rlpark.plugin.rltoys.experiments.parametersweep.parameters.FrozenParameters; 00016 import rlpark.plugin.rltoys.experiments.parametersweep.parameters.RunInfo; 00017 import rlpark.plugin.rltoys.utils.Utils; 00018 import zephyr.plugin.core.api.internal.logfiles.LogFile; 00019 00020 @SuppressWarnings("restriction") 00021 public class ParametersLogFileReader { 00022 public final String filepath; 00023 private final RunInfo infos; 00024 00025 public ParametersLogFileReader(String filepath) { 00026 this.filepath = filepath; 00027 infos = readInfos(); 00028 } 00029 00030 private RunInfo readInfos() { 00031 String infoFilepath = toInfoFilepath(filepath); 00032 if (!new File(infoFilepath).canRead()) 00033 return null; 00034 LogFile logFile = LogFile.load(infoFilepath); 00035 String[] labels = logFile.labels(); 00036 logFile.step(); 00037 double[] values = logFile.currentLine(); 00038 RunInfo infos = new RunInfo(); 00039 for (int i = 0; i < values.length; i++) 00040 infos.put(labels[i], values[i]); 00041 return infos; 00042 } 00043 00044 static protected String toInfoFilepath(String filepath) { 00045 return new File(filepath).getParentFile().getAbsolutePath() + "/infos.txt.gz"; 00046 } 00047 00048 private String[] readLabels(BufferedReader reader) throws IOException { 00049 String line = reader.readLine(); 00050 if (line == null) 00051 return null; 00052 while (line.startsWith("#") || line.startsWith(" ")) 00053 line = line.substring(1); 00054 return line.split(" "); 00055 } 00056 00057 private FrozenParameters readParameter(Set<String> parameterLabels, String[] labels, BufferedReader reader) 00058 throws IOException { 00059 String read = reader.readLine(); 00060 if (read == null) 00061 return null; 00062 Map<String, Double> parameterMap = new LinkedHashMap<String, Double>(); 00063 Map<String, Double> resultMap = new LinkedHashMap<String, Double>(); 00064 String[] values = read.split(" "); 00065 for (int i = 0; i < values.length; i++) 00066 if (parameterLabels.contains(labels[i])) 00067 parameterMap.put(labels[i], Double.parseDouble(values[i])); 00068 else 00069 resultMap.put(labels[i], Double.parseDouble(values[i])); 00070 return new FrozenParameters(infos, parameterMap, resultMap); 00071 } 00072 00073 public List<FrozenParameters> extractParameters(String... parameterLabelsArray) { 00074 Set<String> parameterLabels = Utils.asSet(parameterLabelsArray); 00075 List<FrozenParameters> result = new ArrayList<FrozenParameters>(); 00076 Set<FrozenParameters> alreadyLoaded = new HashSet<FrozenParameters>(); 00077 if (!canRead() || infos == null) 00078 return result; 00079 FileInputStream in = null; 00080 try { 00081 in = new FileInputStream(filepath); 00082 InputStreamReader inReader = new InputStreamReader(in); 00083 BufferedReader reader = new BufferedReader(inReader); 00084 String[] labels = readLabels(reader); 00085 if (labels == null) { 00086 in.close(); 00087 return result; 00088 } 00089 while (reader.ready()) { 00090 FrozenParameters parameters = readParameter(parameterLabels, labels, reader); 00091 if (alreadyLoaded.contains(parameters)) 00092 continue; 00093 result.add(parameters); 00094 alreadyLoaded.add(parameters); 00095 } 00096 in.close(); 00097 } catch (IOException e) { 00098 e.printStackTrace(); 00099 if (in != null) 00100 try { 00101 in.close(); 00102 } catch (IOException e1) { 00103 } 00104 } 00105 return result; 00106 } 00107 00108 private boolean canRead() { 00109 return new File(filepath).canRead(); 00110 } 00111 00112 public RunInfo infos() { 00113 return infos; 00114 } 00115 }