From: <jen...@us...> - 2008-11-12 16:16:29
|
Revision: 1510 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=1510&view=rev Author: jenslehmann Date: 2008-11-12 16:16:24 +0000 (Wed, 12 Nov 2008) Log Message: ----------- - continued EL learning algorithm: although other parts are not yet complete, it already passed the "father test" - slightly changed CLI logging (can now also log to an HTML file in addition to console output) Modified Paths: -------------- trunk/src/dl-learner/org/dllearner/algorithms/el/ELDescriptionNode.java trunk/src/dl-learner/org/dllearner/algorithms/el/ELDescriptionTree.java trunk/src/dl-learner/org/dllearner/algorithms/el/ELLearningAlgorithm.java trunk/src/dl-learner/org/dllearner/algorithms/el/SearchTreeNode.java trunk/src/dl-learner/org/dllearner/cli/Start.java trunk/src/dl-learner/org/dllearner/core/Component.java trunk/src/dl-learner/org/dllearner/utilities/owl/EvaluatedDescriptionSet.java Modified: trunk/src/dl-learner/org/dllearner/algorithms/el/ELDescriptionNode.java =================================================================== --- trunk/src/dl-learner/org/dllearner/algorithms/el/ELDescriptionNode.java 2008-11-12 12:07:48 UTC (rev 1509) +++ trunk/src/dl-learner/org/dllearner/algorithms/el/ELDescriptionNode.java 2008-11-12 16:16:24 UTC (rev 1510) @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.NavigableSet; @@ -399,6 +400,28 @@ return str; } + public String toDescriptionString() { + String str = ""; + if(label.isEmpty()) { + str = "TOP"; + } else { + Iterator<NamedClass> it = label.iterator(); + while(it.hasNext()) { + NamedClass nc = it.next(); + if(it.hasNext()) { + str += nc.toString() + " AND "; + } else { + str += nc.toString(); + } + } + } + for(ELDescriptionEdge edge : edges) { + str += " AND EXISTS " + edge.getLabel().toString() + ".("; + str += edge.getTree().toDescriptionString() + ")"; + } + return str; + } + public ELDescriptionNode getParent() { return parent; } Modified: trunk/src/dl-learner/org/dllearner/algorithms/el/ELDescriptionTree.java =================================================================== --- trunk/src/dl-learner/org/dllearner/algorithms/el/ELDescriptionTree.java 2008-11-12 12:07:48 UTC (rev 1509) +++ trunk/src/dl-learner/org/dllearner/algorithms/el/ELDescriptionTree.java 2008-11-12 16:16:24 UTC (rev 1510) @@ -443,4 +443,13 @@ public String toString() { return rootNode.toString(); } + + /** + * Returns a string of the tree description (without the overhead of converting + * the tree into a description). + * @return A string for the description the tree stands for. + */ + public String toDescriptionString() { + return rootNode.toDescriptionString(); + } } Modified: trunk/src/dl-learner/org/dllearner/algorithms/el/ELLearningAlgorithm.java =================================================================== --- trunk/src/dl-learner/org/dllearner/algorithms/el/ELLearningAlgorithm.java 2008-11-12 12:07:48 UTC (rev 1509) +++ trunk/src/dl-learner/org/dllearner/algorithms/el/ELLearningAlgorithm.java 2008-11-12 16:16:24 UTC (rev 1510) @@ -26,6 +26,7 @@ import java.util.SortedSet; import java.util.TreeSet; +import org.apache.log4j.Logger; import org.dllearner.core.ComponentInitException; import org.dllearner.core.EvaluatedDescription; import org.dllearner.core.LearningAlgorithm; @@ -36,7 +37,6 @@ import org.dllearner.core.configurators.ELLearningAlgorithmConfigurator; import org.dllearner.core.owl.Description; import org.dllearner.core.owl.Thing; -import org.dllearner.learningproblems.PosNegDefinitionLP; import org.dllearner.learningproblems.PosNegLP; import org.dllearner.refinementoperators.ELDown; import org.dllearner.utilities.owl.EvaluatedDescriptionSet; @@ -52,6 +52,7 @@ */ public class ELLearningAlgorithm extends LearningAlgorithm { + private static Logger logger = Logger.getLogger(ELLearningAlgorithm.class); private ELLearningAlgorithmConfigurator configurator; private ELDown operator; @@ -64,12 +65,16 @@ private SearchTreeNode startNode; private ELHeuristic heuristic; - private SortedSet<SearchTreeNode> candidates; + private TreeSet<SearchTreeNode> candidates; public ELLearningAlgorithm(PosNegLP problem, ReasonerComponent reasoner) { super(problem, reasoner); } + public static String getName() { + return "standard EL learning algorithm"; + } + public static Collection<Class<? extends LearningProblem>> supportedLearningProblems() { Collection<Class<? extends LearningProblem>> problems = new LinkedList<Class<? extends LearningProblem>>(); problems.add(PosNegLP.class); @@ -101,18 +106,28 @@ isRunning = true; reset(); + // create start node ELDescriptionTree top = new ELDescriptionTree(reasoner, Thing.instance); addDescriptionTree(top, null); + // main loop + int loop = 0; while(!stop && !stoppingCriteriaSatisfied()) { // pick the best candidate according to the heuristic - SearchTreeNode best = candidates.last(); + SearchTreeNode best = candidates.pollLast(); // apply operator Set<ELDescriptionTree> refinements = operator.refine(best.getDescriptionTree()); // add all refinements to search tree, candidates, best descriptions for(ELDescriptionTree refinement : refinements) { addDescriptionTree(refinement, best); } + loop++; + // logging + if(logger.isTraceEnabled()) { + logger.trace("Choosen node " + best); + logger.trace(startNode.getTreeString()); + logger.trace("Loop " + loop + " completed."); + } } isRunning = false; @@ -146,18 +161,16 @@ // check whether we want to add it to the best evaluated descriptions; // to do this we pick the worst considered evaluated description - // (remember that the set has limited size, so it's likely not the worst overall) - EvaluatedDescription worst = bestEvaluatedDescriptions.getSet().first(); + // (remember that the set has limited size, so it's likely not the worst overall); // the description has a chance to make it in the set if it has // at least as high accuracy - if not we can save the reasoner calls // for fully computing the evaluated description - if(worst.getCoveredNegatives().size() >= node.getCoveredNegatives()) { + if(bestEvaluatedDescriptions.size() == 0 || bestEvaluatedDescriptions.getWorst().getCoveredNegatives().size() >= node.getCoveredNegatives()) { Score score = learningProblem.computeScore(description); EvaluatedDescription ed = new EvaluatedDescription(description, score); bestEvaluatedDescriptions.add(ed); } - // TODO add a method to EvaluatedDescriptionSet for returning the - // minimum accuracy required + } } Modified: trunk/src/dl-learner/org/dllearner/algorithms/el/SearchTreeNode.java =================================================================== --- trunk/src/dl-learner/org/dllearner/algorithms/el/SearchTreeNode.java 2008-11-12 12:07:48 UTC (rev 1509) +++ trunk/src/dl-learner/org/dllearner/algorithms/el/SearchTreeNode.java 2008-11-12 16:16:24 UTC (rev 1510) @@ -19,8 +19,11 @@ */ package org.dllearner.algorithms.el; +import java.util.LinkedList; import java.util.List; +import org.dllearner.algorithms.refinement.Node; + /** * A node in the search tree of an EL algorithm. * @@ -31,7 +34,7 @@ private ELDescriptionTree descriptionTree; - private List<SearchTreeNode> children; + private List<SearchTreeNode> children = new LinkedList<SearchTreeNode>(); private int coveredNegatives; private boolean tooWeak = false; @@ -87,4 +90,32 @@ return children; } + @Override + public String toString() { + String ret = descriptionTree.toDescriptionString() + " [q:"; + if(tooWeak) + ret += "tw"; + else + ret += coveredNegatives; + ret += ", children:" + children.size() + "]"; + return ret; + } + + public String getTreeString() { + return getTreeString(0).toString(); + } + + private StringBuilder getTreeString(int depth) { + StringBuilder treeString = new StringBuilder(); + for(int i=0; i<depth-1; i++) + treeString.append(" "); + if(depth!=0) + treeString.append("|--> "); + treeString.append(toString()+"\n"); + for(SearchTreeNode child : children) { + treeString.append(child.getTreeString(depth+1)); + } + return treeString; + } + } Modified: trunk/src/dl-learner/org/dllearner/cli/Start.java =================================================================== --- trunk/src/dl-learner/org/dllearner/cli/Start.java 2008-11-12 12:07:48 UTC (rev 1509) +++ trunk/src/dl-learner/org/dllearner/cli/Start.java 2008-11-12 16:16:24 UTC (rev 1510) @@ -37,11 +37,11 @@ import org.apache.log4j.ConsoleAppender; import org.apache.log4j.FileAppender; +import org.apache.log4j.HTMLLayout; import org.apache.log4j.Layout; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; -import org.apache.log4j.SimpleLayout; import org.dllearner.Info; import org.dllearner.algorithms.BruteForceLearner; import org.dllearner.algorithms.RandomGuesser; @@ -104,7 +104,8 @@ */ public class Start { - private static Logger logger = Logger.getRootLogger(); + private static Logger logger = Logger.getLogger(Start.class); + private static Logger rootLogger = Logger.getRootLogger(); private static ConfMapper confMapper = new ConfMapper(); @@ -145,28 +146,51 @@ // logger 1 is the console, where we print only info messages; // the logger is plain, i.e. does not output log level etc. Layout layout = new PatternLayout(); + ConsoleAppender consoleAppender = new ConsoleAppender(layout); + // setting a threshold suppresses log messages below this level; + // this means that if you want to e.g. see all trace messages on + // console, you have to set the threshold and log level to trace + // (but we recommend just setting the log level to trace and observe + // the log file) consoleAppender.setThreshold(Level.INFO); // logger 2 is writes to a file; it records all debug messages - // and includes the log level - Layout layout2 = new SimpleLayout(); + // (you can choose HTML or TXT) + boolean htmlLog = false; + Layout layout2 = null; FileAppender fileAppenderNormal = null; - File f = new File("log/sparql.txt"); + String fileName; + if(htmlLog) { + layout2 = new HTMLLayout(); + fileName = "log/log.html"; + } else { + // simple variant: layout2 = new SimpleLayout(); + layout2 = new PatternLayout("%r [%t] %-5p %c :\n%m%n\n"); + fileName = "log/log.txt"; + } try { - fileAppenderNormal = new FileAppender(layout2, "log/log.txt", false); - f.delete(); - f.createNewFile(); + fileAppenderNormal = new FileAppender(layout2, fileName, false); } catch (IOException e) { e.printStackTrace(); + } + + // add both loggers + rootLogger.removeAllAppenders(); + rootLogger.addAppender(consoleAppender); + rootLogger.addAppender(fileAppenderNormal); + rootLogger.setLevel(Level.DEBUG); + + // SPARQL log + File f = new File("log/sparql.txt"); + f.delete(); + try { + f.createNewFile(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); } -// fileAppenderNormal.setThreshold(Level.DEBUG); - logger.removeAllAppenders(); - logger.addAppender(consoleAppender); - logger.addAppender(fileAppenderNormal); - logger.setLevel(Level.DEBUG); - // Logger.getLogger(KnowledgeSource.class).setLevel(Level.WARN); // Logger.getLogger(SparqlKnowledgeSource.class).setLevel(Level.WARN); // Logger.getLogger(TypedSparqlQuery.class).setLevel(Level.WARN); @@ -640,19 +664,19 @@ } else if (name.equals("logLevel")) { String level = cliOption.getStringValue(); if (level.equals("off")) - logger.setLevel(Level.OFF); + rootLogger.setLevel(Level.OFF); else if (level.equals("trace")) - logger.setLevel(Level.TRACE); + rootLogger.setLevel(Level.TRACE); else if (level.equals("info")) - logger.setLevel(Level.INFO); + rootLogger.setLevel(Level.INFO); else if (level.equals("debug")) - logger.setLevel(Level.DEBUG); + rootLogger.setLevel(Level.DEBUG); else if (level.equals("warn")) - logger.setLevel(Level.WARN); + rootLogger.setLevel(Level.WARN); else if (level.equals("error")) - logger.setLevel(Level.ERROR); + rootLogger.setLevel(Level.ERROR); else if (level.equals("fatal")) - logger.setLevel(Level.FATAL); + rootLogger.setLevel(Level.FATAL); } else handleError("Unknown CLI option \"" + name + "\"."); } Modified: trunk/src/dl-learner/org/dllearner/core/Component.java =================================================================== --- trunk/src/dl-learner/org/dllearner/core/Component.java 2008-11-12 12:07:48 UTC (rev 1509) +++ trunk/src/dl-learner/org/dllearner/core/Component.java 2008-11-12 16:16:24 UTC (rev 1510) @@ -51,7 +51,8 @@ /** * Returns the name of this component. By default, "unnamed * component" is returned, but all implementations of components - * are strongly encouraged to overwrite this method. + * are strongly encouraged to provide a static method returning + * the name. * @return The name of this component. */ public static String getName() { Modified: trunk/src/dl-learner/org/dllearner/utilities/owl/EvaluatedDescriptionSet.java =================================================================== --- trunk/src/dl-learner/org/dllearner/utilities/owl/EvaluatedDescriptionSet.java 2008-11-12 12:07:48 UTC (rev 1509) +++ trunk/src/dl-learner/org/dllearner/utilities/owl/EvaluatedDescriptionSet.java 2008-11-12 16:16:24 UTC (rev 1510) @@ -64,6 +64,18 @@ } } + public int size() { + return set.size(); + } + + public EvaluatedDescription getBest() { + return set.last(); + } + + public EvaluatedDescription getWorst() { + return set.first(); + } + /** * @return the set */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |