summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/result/textwriter/TextWriter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/result/textwriter/TextWriter.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/result/textwriter/TextWriter.java147
1 files changed, 70 insertions, 77 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/result/textwriter/TextWriter.java b/src/de/lmu/ifi/dbs/elki/result/textwriter/TextWriter.java
index 0cbc81f2..836292ac 100644
--- a/src/de/lmu/ifi/dbs/elki/result/textwriter/TextWriter.java
+++ b/src/de/lmu/ifi/dbs/elki/result/textwriter/TextWriter.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.result.textwriter;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2013
+ Copyright (C) 2014
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -41,7 +41,6 @@ import de.lmu.ifi.dbs.elki.data.FeatureVector;
import de.lmu.ifi.dbs.elki.data.HierarchicalClassLabel;
import de.lmu.ifi.dbs.elki.data.LabelList;
import de.lmu.ifi.dbs.elki.data.SimpleClassLabel;
-import de.lmu.ifi.dbs.elki.data.model.ClusterModel;
import de.lmu.ifi.dbs.elki.data.model.Model;
import de.lmu.ifi.dbs.elki.data.type.TypeUtil;
import de.lmu.ifi.dbs.elki.database.Database;
@@ -51,7 +50,6 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
import de.lmu.ifi.dbs.elki.database.ids.DBIDs;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
import de.lmu.ifi.dbs.elki.datasource.bundle.SingleObjectBundle;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
import de.lmu.ifi.dbs.elki.math.linearalgebra.Vector;
import de.lmu.ifi.dbs.elki.result.CollectionResult;
import de.lmu.ifi.dbs.elki.result.IterableResult;
@@ -66,17 +64,15 @@ import de.lmu.ifi.dbs.elki.result.textwriter.writers.TextWriterObjectArray;
import de.lmu.ifi.dbs.elki.result.textwriter.writers.TextWriterObjectInline;
import de.lmu.ifi.dbs.elki.result.textwriter.writers.TextWriterPair;
import de.lmu.ifi.dbs.elki.result.textwriter.writers.TextWriterTextWriteable;
-import de.lmu.ifi.dbs.elki.result.textwriter.writers.TextWriterTriple;
import de.lmu.ifi.dbs.elki.result.textwriter.writers.TextWriterVector;
import de.lmu.ifi.dbs.elki.utilities.HandlerList;
import de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy.Hierarchy;
import de.lmu.ifi.dbs.elki.utilities.exceptions.UnableToComplyException;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.TrackedParameter;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.SerializedParameterization;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ClassParameter;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter;
import de.lmu.ifi.dbs.elki.utilities.pairs.DoubleDoublePair;
import de.lmu.ifi.dbs.elki.utilities.pairs.Pair;
-import de.lmu.ifi.dbs.elki.utilities.pairs.Triple;
/**
* Class to write a result to human-readable text output.
@@ -108,7 +104,6 @@ public class TextWriter {
TextWriterObjectInline trivialwriter = new TextWriterObjectInline();
writers.insertHandler(Pair.class, new TextWriterPair());
writers.insertHandler(DoubleDoublePair.class, new TextWriterDoubleDoublePair());
- writers.insertHandler(Triple.class, new TextWriterTriple());
writers.insertHandler(FeatureVector.class, trivialwriter);
// these object can be serialized inline with toString()
writers.insertHandler(String.class, trivialwriter);
@@ -119,7 +114,6 @@ public class TextWriter {
writers.insertHandler(Integer[].class, new TextWriterObjectArray<Integer>());
writers.insertHandler(BitSet.class, trivialwriter);
writers.insertHandler(Vector.class, new TextWriterVector());
- writers.insertHandler(Distance.class, trivialwriter);
writers.insertHandler(SimpleClassLabel.class, trivialwriter);
writers.insertHandler(HierarchicalClassLabel.class, trivialwriter);
writers.insertHandler(LabelList.class, trivialwriter);
@@ -141,19 +135,20 @@ public class TextWriter {
* @return unique filename
*/
protected String getFilename(Object result, String filenamepre) {
- if (filenamepre == null || filenamepre.length() == 0) {
+ if(filenamepre == null || filenamepre.length() == 0) {
filenamepre = "result";
}
int i = 0;
- while (true) {
+ while(true) {
String filename;
- if (i > 0) {
+ if(i > 0) {
filename = filenamepre + "-" + i;
- } else {
+ }
+ else {
filename = filenamepre;
}
Object existing = filenames.get(filename);
- if (existing == null || existing == result) {
+ if(existing == null || existing == result) {
filenames.put(filename, result);
return filename;
}
@@ -183,33 +178,33 @@ public class TextWriter {
// Split result objects in different known types:
{
List<Result> results = ResultUtil.filterResults(r, Result.class);
- for (Result res : results) {
- if (filter != null) {
+ for(Result res : results) {
+ if(filter != null) {
final String nam = res.getShortName();
- if (nam == null || !filter.matcher(nam).find()) {
+ if(nam == null || !filter.matcher(nam).find()) {
continue;
}
}
- if (res instanceof Database) {
+ if(res instanceof Database) {
continue;
}
- if (res instanceof Relation) {
+ if(res instanceof Relation) {
ra.add((Relation<?>) res);
continue;
}
- if (res instanceof OrderingResult) {
+ if(res instanceof OrderingResult) {
ro.add((OrderingResult) res);
continue;
}
- if (res instanceof Clustering) {
+ if(res instanceof Clustering) {
rc.add((Clustering<?>) res);
continue;
}
- if (res instanceof IterableResult) {
+ if(res instanceof IterableResult) {
ri.add((IterableResult<?>) res);
continue;
}
- if (res instanceof SettingsResult) {
+ if(res instanceof SettingsResult) {
rs.add((SettingsResult) res);
continue;
}
@@ -219,19 +214,19 @@ public class TextWriter {
writeSettingsResult(streamOpener, rs);
- for (IterableResult<?> rii : ri) {
+ for(IterableResult<?> rii : ri) {
writeIterableResult(streamOpener, rii);
}
- for (Clustering<?> c : rc) {
+ for(Clustering<?> c : rc) {
NamingScheme naming = new SimpleEnumeratingScheme(c);
- for (Cluster<?> clus : c.getAllClusters()) {
+ for(Cluster<?> clus : c.getAllClusters()) {
writeClusterResult(db, streamOpener, (Clustering<Model>) c, (Cluster<Model>) clus, ra, naming);
}
}
- for (OrderingResult ror : ro) {
+ for(OrderingResult ror : ro) {
writeOrderingResult(db, streamOpener, ror, ra);
}
- for (Result otherr : otherres) {
+ for(Result otherr : otherres) {
writeOtherResult(streamOpener, otherr);
}
}
@@ -239,16 +234,16 @@ public class TextWriter {
private void printObject(TextWriterStream out, Database db, final DBIDRef objID, List<Relation<?>> ra) throws UnableToComplyException, IOException {
SingleObjectBundle bundle = db.getBundle(objID);
// Write database element itself.
- for (int i = 0; i < bundle.metaLength(); i++) {
+ for(int i = 0; i < bundle.metaLength(); i++) {
Object obj = bundle.data(i);
- if (obj != null) {
+ if(obj != null) {
TextWriterWriterInterface<?> owriter = out.getWriterFor(obj);
- if (owriter == null) {
+ if(owriter == null) {
throw new UnableToComplyException("No handler for database object itself: " + obj.getClass().getSimpleName());
}
String lbl = null;
// TODO: ugly compatibility hack...
- if (TypeUtil.DBID.isAssignableFromType(bundle.meta(i))) {
+ if(TypeUtil.DBID.isAssignableFromType(bundle.meta(i))) {
lbl = "ID";
}
owriter.writeObject(out, lbl, obj);
@@ -257,19 +252,19 @@ public class TextWriter {
Collection<Relation<?>> dbrels = db.getRelations();
// print the annotations
- if (ra != null) {
- for (Relation<?> a : ra) {
+ if(ra != null) {
+ for(Relation<?> a : ra) {
// Avoid duplicated output.
- if (dbrels.contains(a)) {
+ if(dbrels.contains(a)) {
continue;
}
String label = a.getShortName();
Object value = a.get(objID);
- if (value == null) {
+ if(value == null) {
continue;
}
TextWriterWriterInterface<?> writer = out.getWriterFor(value);
- if (writer == null) {
+ if(writer == null) {
// Ignore
continue;
}
@@ -281,9 +276,10 @@ public class TextWriter {
private void writeClusterResult(Database db, StreamFactory streamOpener, Clustering<Model> clustering, Cluster<Model> clus, List<Relation<?>> ra, NamingScheme naming) throws FileNotFoundException, UnableToComplyException, IOException {
String filename = null;
- if (naming != null) {
+ if(naming != null) {
filename = filenameFromLabel(naming.getNameFor(clus));
- } else {
+ }
+ else {
filename = "cluster";
}
@@ -292,25 +288,19 @@ public class TextWriter {
// Write cluster information
out.commentPrintLn("Cluster: " + naming.getNameFor(clus));
- Model model = clus.getModel();
- if (model != ClusterModel.CLUSTER && model != null) {
- TextWriterWriterInterface<?> mwri = out.getWriterFor(model);
- if (mwri != null) {
- mwri.writeObject(out, null, model);
- }
- }
- if (clustering.getClusterHierarchy().numParents(clus) > 0) {
+ clus.writeToText(out, null);
+ if(clustering.getClusterHierarchy().numParents(clus) > 0) {
StringBuilder buf = new StringBuilder();
buf.append("Parents:");
- for (Hierarchy.Iter<Cluster<Model>> iter = clustering.getClusterHierarchy().iterParents(clus); iter.valid(); iter.advance()) {
+ for(Hierarchy.Iter<Cluster<Model>> iter = clustering.getClusterHierarchy().iterParents(clus); iter.valid(); iter.advance()) {
buf.append(' ').append(naming.getNameFor(iter.get()));
}
out.commentPrintLn(buf.toString());
}
- if (clustering.getClusterHierarchy().numChildren(clus) > 0) {
+ if(clustering.getClusterHierarchy().numChildren(clus) > 0) {
StringBuilder buf = new StringBuilder();
buf.append("Children:");
- for (Hierarchy.Iter<Cluster<Model>> iter = clustering.getClusterHierarchy().iterChildren(clus); iter.valid(); iter.advance()) {
+ for(Hierarchy.Iter<Cluster<Model>> iter = clustering.getClusterHierarchy().iterChildren(clus); iter.valid(); iter.advance()) {
buf.append(' ').append(naming.getNameFor(iter.get()));
}
out.commentPrintLn(buf.toString());
@@ -319,7 +309,7 @@ public class TextWriter {
// print ids.
DBIDs ids = clus.getIDs();
- for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
+ for(DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
printObject(out, db, iter, ra);
}
out.flush();
@@ -331,20 +321,20 @@ public class TextWriter {
TextWriterStream out = new TextWriterStream(outStream, writers);
// hack to print collectionResult header information
- if (ri instanceof CollectionResult<?>) {
+ if(ri instanceof CollectionResult<?>) {
final Collection<String> hdr = ((CollectionResult<?>) ri).getHeader();
- if (hdr != null) {
- for (String header : hdr) {
+ if(hdr != null) {
+ for(String header : hdr) {
out.commentPrintLn(header);
}
out.flush();
}
}
Iterator<?> i = ri.iterator();
- while (i.hasNext()) {
+ while(i.hasNext()) {
Object o = i.next();
TextWriterWriterInterface<?> writer = out.getWriterFor(o);
- if (writer != null) {
+ if(writer != null) {
writer.writeObject(out, null, o);
}
out.flush();
@@ -357,7 +347,7 @@ public class TextWriter {
PrintStream outStream = streamOpener.openStream(getFilename(or, or.getShortName()));
TextWriterStream out = new TextWriterStream(outStream, writers);
- for (DBIDIter i = or.iter(or.getDBIDs()).iter(); i.valid(); i.advance()) {
+ for(DBIDIter i = or.iter(or.getDBIDs()).iter(); i.valid(); i.advance()) {
printObject(out, db, i, ra);
}
out.flush();
@@ -365,7 +355,7 @@ public class TextWriter {
}
private void writeSettingsResult(StreamFactory streamOpener, List<SettingsResult> rs) throws UnableToComplyException, IOException {
- if (rs.size() < 1) {
+ if(rs.size() < 1) {
return;
}
SettingsResult r = rs.get(0);
@@ -373,38 +363,41 @@ public class TextWriter {
TextWriterStream out = new TextWriterStream(outStream, writers);
// Write settings preamble
out.commentPrintLn("Settings:");
-
- if (rs != null) {
- for (SettingsResult settings : rs) {
+
+ if(rs != null) {
+ for(SettingsResult settings : rs) {
Object last = null;
- for (Pair<Object, Parameter<?>> setting : settings.getSettings()) {
- if (setting.first != last && setting.first != null) {
- if (last != null) {
+ for(TrackedParameter setting : settings.getSettings()) {
+ if(setting.getOwner() != last && setting.getOwner() != null) {
+ if(last != null) {
out.commentPrintLn("");
}
String name;
try {
- if (setting.first instanceof Class) {
- name = ((Class<?>) setting.first).getName();
- } else {
- name = setting.first.getClass().getName();
+ if(setting.getOwner() instanceof Class) {
+ name = ((Class<?>) setting.getOwner()).getName();
+ }
+ else {
+ name = setting.getOwner().getClass().getName();
}
- if (ClassParameter.class.isInstance(setting.first)) {
- name = ((ClassParameter<?>) setting.first).getValue().getName();
+ if(ClassParameter.class.isInstance(setting.getOwner())) {
+ name = ((ClassParameter<?>) setting.getOwner()).getValue().getName();
}
- } catch (NullPointerException e) {
+ }
+ catch(NullPointerException e) {
name = "[null]";
}
out.commentPrintLn(name);
- last = setting.first;
+ last = setting.getOwner();
}
- String name = setting.second.getOptionID().getName();
+ String name = setting.getParameter().getOptionID().getName();
String value = "[unset]";
try {
- if (setting.second.isDefined()) {
- value = setting.second.getValueAsString();
+ if(setting.getParameter().isDefined()) {
+ value = setting.getParameter().getValueAsString();
}
- } catch (NullPointerException e) {
+ }
+ catch(NullPointerException e) {
value = "[null]";
}
out.commentPrintLn(SerializedParameterization.OPTION_PREFIX + name + " " + value);
@@ -416,11 +409,11 @@ public class TextWriter {
}
private void writeOtherResult(StreamFactory streamOpener, Result r) throws UnableToComplyException, IOException {
- if (writers.getHandler(r) != null) {
+ if(writers.getHandler(r) != null) {
PrintStream outStream = streamOpener.openStream(getFilename(r, r.getShortName()));
TextWriterStream out = new TextWriterStream(outStream, writers);
TextWriterWriterInterface<?> owriter = out.getWriterFor(r);
- if (owriter == null) {
+ if(owriter == null) {
throw new UnableToComplyException("No handler for result class: " + r.getClass().getSimpleName());
}
// Write data