package org.jactr.tools.itr.ortho.impl;
import java.io.PrintWriter;
import java.text.NumberFormat;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import org.jactr.tools.itr.ortho.ISlice;
import org.jactr.tools.itr.ortho.ISliceAnalysis;
public class SliceAnalysis implements ISliceAnalysis
{
static final private String FLAGGED_KEY = "flag";
static final private String RMSE_KEY = "RMSE";
static final private String R_SQUARE_KEY = "RSquared";
static final private String N_KEY = "N";
final private ISlice _slice;
private Object _result;
private boolean _flagged;
private String _notes;
final private Map<String, String> _models;
final private Map<String, Map<String, String>> _fitStatMap;
final private String _workingDirectory;
final private Map<String, String> _images;
final private Map<String, String> _details;
public SliceAnalysis(ISlice slice, String workingDirectory)
{
_slice = slice;
_models = new TreeMap<String, String>();
_images = new TreeMap<String, String>();
_details = new LinkedHashMap<String, String>();
_workingDirectory = workingDirectory;
_fitStatMap = new TreeMap<String, Map<String, String>>();
}
public void addFitStatistics(String label, double rmse, double rsquare,
long n, boolean flagged)
{
Map<String, String> stats = new TreeMap<String, String>();
NumberFormat format = NumberFormat.getNumberInstance();
format.setMaximumFractionDigits(3);
stats.put(RMSE_KEY, format.format(rmse));
stats.put(R_SQUARE_KEY, format.format(rsquare));
stats.put(N_KEY, Long.toString(n));
addFitStatistics(label, stats, flagged);
}
public void addFitStatistics(String label, Map<String, String> stats,
boolean flagged)
{
Map<String, String> current = _fitStatMap.get(label);
if (current == null)
{
current = new TreeMap<String, String>(stats);
_fitStatMap.put(label, current);
}
else
current.putAll(stats);
current.put(FLAGGED_KEY, Boolean.toString(flagged));
if (flagged) setFlagEnabled(true);
}
public Map<String, Map<String,String>> getFitStatistics()
{
return Collections.unmodifiableMap(_fitStatMap);
}
public void setResult(Object result)
{
_result = result;
}
public Object getResult()
{
return _result;
}
public ISlice getSlice()
{
return _slice;
}
public boolean isFlagged()
{
return _flagged;
}
public void setFlagEnabled(boolean flag)
{
_flagged = flag;
}
public Map<String, String> getModels()
{
return Collections.unmodifiableMap(_models);
}
public void addModel(String modelName, String sliceRelativePath)
{
_models.put(modelName, sliceRelativePath);
}
public String getWorkingDirectory()
{
return _workingDirectory;
}
public Map<String, String> getImages()
{
return Collections.unmodifiableMap(_images);
}
public void addImage(String label, String workingRelativePath)
{
_images.put(label, workingRelativePath);
}
public void addDetail(String label, String workingRelativePath)
{
_details.put(label, workingRelativePath);
}
public Map<String, String> getDetails()
{
return Collections.unmodifiableMap(_details);
}
public void write(PrintWriter pw)
{
NumberFormat format = NumberFormat.getNumberInstance();
format.setMaximumFractionDigits(3);
pw.println(" <slice id=\"" + _slice.getId() + "\" flag=\"" + _flagged
+ "\" n=\"" + (_slice.getLastIteration() - _slice.getFirstIteration())
+ "\">");
pw.println(" <models>");
for (Map.Entry<String, String> model : _models.entrySet())
pw.println(" <model name=\"" + model.getKey() + "\" url=\""
+ model.getValue() + "\"/>");
pw.println(" </models>");
pw.println(" <parameters>");
for (Map.Entry<String, Object> parameter : _slice.getParameterValues()
.entrySet())
pw.println(" <parameter name=\"" + parameter.getKey() + "\" value=\""
+ parameter.getValue() + "\"/>");
pw.println(" </parameters>");
pw.println(" <fits>");
StringBuilder tmp = new StringBuilder();
for (Map.Entry<String, Map<String, String>> fit : _fitStatMap.entrySet())
{
if (tmp.length() > 0) tmp.delete(0, tmp.length());
tmp.append(" <fit label=\"");
tmp.append(fit.getKey());
tmp.append("\" ");
for(Map.Entry<String, String> stat : fit.getValue().entrySet())
tmp.append(stat.getKey()).append("=\"").append(stat.getValue()).append("\" ");
tmp.append("/>");
pw.println(tmp.toString());
}
pw.println(" </fits>");
writeDetails(pw);
/*
* we also want to generate the images.xml if images were provided
*/
if (_images.size() != 0) writeImages(pw);
String notes = getNotes();
if (notes != null)
{
pw.println(" <notes><![CDATA[");
pw.println(notes);
pw.println(" ]]></notes>");
}
pw.println(" </slice>");
}
private void writeDetails(PrintWriter pw)
{
pw.println(" <details>");
for (Map.Entry<String, String> entry : _details.entrySet())
pw.println(" <detail label=\"" + entry.getKey() + "\" url=\""
+ entry.getValue() + "\"/>");
pw.println(" </details>");
}
private void writeImages(PrintWriter pw)
{
pw.println(" <images>");
for (Map.Entry<String, String> entry : _images.entrySet())
pw.println(" <image label=\"" + entry.getKey() + "\" url=\""
+ entry.getValue() + "\"/>");
pw.println(" </images>");
}
public String getNotes()
{
return _notes;
}
public void setNotes(String notes)
{
_notes = notes;
}
}