diff options
Diffstat (limited to 'elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal')
4 files changed, 58 insertions, 11 deletions
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/CheckELKIServices.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/CheckELKIServices.java index e18bd633..b0e17e6d 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/CheckELKIServices.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/CheckELKIServices.java @@ -58,6 +58,7 @@ import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; * implementations. * * @author Erich Schubert + * @since 0.2 * * @apiviz.uses ELKIServiceLoader */ @@ -243,6 +244,7 @@ public class CheckELKIServices { if(parts.length > 1) { StringBuilder buf = new StringBuilder(); buf.append("Class ").append(classname); + buf.append(" in ").append(parent.getCanonicalName()); buf.append(" has the following extraneous aliases:"); for(int i = 1; i < parts.length; i++) { buf.append(' ').append(parts[i]); @@ -261,6 +263,7 @@ public class CheckELKIServices { if(buf == null) { buf = new StringBuilder(); buf.append("Class ").append(classname); + buf.append(" in ").append(parent.getCanonicalName()); buf.append(" is missing the following aliases:"); } buf.append(' ').append(a); @@ -274,6 +277,7 @@ public class CheckELKIServices { buf.append('\n'); } buf.append("Class ").append(classname); + buf.append(" in ").append(parent.getCanonicalName()); buf.append(" has the following extraneous aliases:"); for(String a : aliases) { buf.append(' ').append(a); diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/CheckParameterizables.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/CheckParameterizables.java index a278f287..4c106f83 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/CheckParameterizables.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/CheckParameterizables.java @@ -52,6 +52,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz * interface. * * @author Erich Schubert + * @since 0.3 * * @apiviz.landmark * @apiviz.uses AbstractParameterizer diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentParameters.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentParameters.java index eea3dad6..8325872b 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentParameters.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentParameters.java @@ -57,6 +57,7 @@ import de.lmu.ifi.dbs.elki.application.AbstractApplication; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.logging.Logging.Level; import de.lmu.ifi.dbs.elki.logging.LoggingConfiguration; +import de.lmu.ifi.dbs.elki.math.random.RandomFactory; import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil; import de.lmu.ifi.dbs.elki.utilities.ELKIServiceRegistry; import de.lmu.ifi.dbs.elki.utilities.ELKIServiceScanner; @@ -70,6 +71,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.UnParameter import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ClassListParameter; 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.optionhandling.parameters.RandomParameter; import de.lmu.ifi.dbs.elki.utilities.pairs.Pair; import de.lmu.ifi.dbs.elki.utilities.xml.HTMLUtil; @@ -78,6 +80,7 @@ import de.lmu.ifi.dbs.elki.utilities.xml.HTMLUtil; * {@link Parameter}s. Used in documentation generation only. * * @author Erich Schubert + * @since 0.2 * * @apiviz.uses Parameter */ @@ -182,7 +185,7 @@ public class DocumentParameters { throw new RuntimeException(e); } try { - PrintStream byclassstream = new PrintStream(new BufferedOutputStream(byclassfo)); + PrintStream byclassstream = new PrintStream(new BufferedOutputStream(byclassfo), false, "UTF-8"); makeByClassOverviewWiki(byclass, new WikiStream(byclassstream)); byclassstream.flush(); byclassstream.close(); @@ -245,7 +248,9 @@ public class DocumentParameters { private static void buildParameterIndex(Map<Class<?>, List<Parameter<?>>> byclass, Map<OptionID, List<Pair<Parameter<?>, Class<?>>>> byopt) { final ArrayList<TrackedParameter> options = new ArrayList<>(); ExecutorService es = Executors.newSingleThreadExecutor(); - for(final Class<?> cls : ELKIServiceRegistry.findAllImplementations(Object.class, false, true)) { + List<Class<?>> objs = ELKIServiceRegistry.findAllImplementations(Object.class, false, true); + Collections.sort(objs, new ELKIServiceScanner.ClassSorter()); + for(final Class<?> cls : objs) { // Doesn't have a proper name? if(cls.getCanonicalName() == null) { continue; @@ -720,9 +725,18 @@ public class DocumentParameters { Element maindl = htmldoc.createElement(HTMLUtil.HTML_DL_TAG); body.appendChild(maindl); - List<OptionID> opts = new ArrayList<>(byopt.keySet()); - Collections.sort(opts, new SortByOption()); + final Comparator<OptionID> osort = new SortByOption(); + final Comparator<Class<?>> csort = new ELKIServiceScanner.ClassSorter(); + Comparator<Pair<Parameter<?>, Class<?>>> psort = new Comparator<Pair<Parameter<?>, Class<?>>>() { + @Override + public int compare(Pair<Parameter<?>, Class<?>> o1, Pair<Parameter<?>, Class<?>> o2) { + int c = osort.compare(o1.first.getOptionID(), o2.first.getOptionID()); + return (c != 0) ? c : csort.compare(o1.second, o2.second); + } + }; + List<OptionID> opts = new ArrayList<>(byopt.keySet()); + Collections.sort(opts, osort); for(OptionID oid : opts) { final Parameter<?> firstopt = byopt.get(oid).get(0).getFirst(); // DT = definition term @@ -787,7 +801,9 @@ public class DocumentParameters { optdd.appendChild(p); } optdd.appendChild(classesul); - for(Pair<Parameter<?>, Class<?>> clinst : byopt.get(oid)) { + List<Pair<Parameter<?>, Class<?>>> plist = byopt.get(oid); + Collections.sort(plist, psort); + for(Pair<Parameter<?>, Class<?>> clinst : plist) { // DT definition term: option name, in TT for typewriter optics Element classli = htmldoc.createElement(HTMLUtil.HTML_LI_TAG); @@ -1020,9 +1036,11 @@ public class DocumentParameters { if(par instanceof ClassParameter<?>) { appendDefaultClassLink(htmldoc, par, p); } + else if(par instanceof RandomParameter && par.getDefaultValue() == RandomFactory.DEFAULT) { + p.appendChild(htmldoc.createTextNode("use global random seed")); + } else { - Object def = par.getDefaultValue(); - p.appendChild(htmldoc.createTextNode(def.toString())); + p.appendChild(htmldoc.createTextNode(par.getDefaultValueAsString())); } optdd.appendChild(p); } @@ -1047,9 +1065,11 @@ public class DocumentParameters { final Class<?> name = ((ClassParameter<?>) par).getDefaultValue(); out.javadocLink(name, null); } + else if(par instanceof RandomParameter && par.getDefaultValue() == RandomFactory.DEFAULT) { + out.print("use global random seed"); + } else { - Object def = par.getDefaultValue(); - out.print(def.toString()); + out.print(par.getDefaultValueAsString()); } out.println(); } diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentReferences.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentReferences.java index 7d448fca..66f2bda8 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentReferences.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentReferences.java @@ -60,6 +60,7 @@ import de.lmu.ifi.dbs.elki.utilities.xml.HTMLUtil; * Build a reference documentation for all available parameters. * * @author Erich Schubert + * @since 0.3 * * @apiviz.uses Reference */ @@ -105,7 +106,7 @@ public class DocumentReferences { try { File refwiki = new File(args[1]); FileOutputStream reffow = new FileOutputStream(refwiki); - PrintStream refstreamW = new PrintStream(reffow); + PrintStream refstreamW = new PrintStream(reffow, false, "UTF-8"); documentReferencesWiki(refs, refstreamW); refstreamW.flush(); refstreamW.close(); @@ -330,7 +331,28 @@ public class DocumentReferences { @Override public int compare(Pair<Reference, TreeSet<Object>> p1, Pair<Reference, TreeSet<Object>> p2) { final Object o1 = p1.second.first(), o2 = p2.second.first(); - return COMPARATOR.compare(o1, o2); + int c = COMPARATOR.compare(o1, o2); + if(c == 0) { + Reference r1 = p1.first, r2 = p2.first; + c = compareNull(r1.title(), r2.title()); + c = (c != 0) ? c : compareNull(r1.authors(), r2.authors()); + c = (c != 0) ? c : compareNull(r1.booktitle(), r2.booktitle()); + } + return c; + } + + /** + * Null-tolerant String comparison. + * + * @param s1 First string + * @param s2 Second string + * @return Order + */ + private int compareNull(String s1, String s2) { + return (s1 == s2) ? 0 // + : (s1 == null) ? -1 // + : (s2 == null) ? +1 // + : s1.compareTo(s2); } }); return refs; |