/* Copyright 2008, 2009, 2010 by the Oxford University Computing Laboratory
This file is part of HermiT.
HermiT is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
HermiT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with HermiT. If not, see <http://www.gnu.org/licenses/>.
*/
package org.semanticweb.HermiT.monitor;
import java.io.PrintWriter;
import org.semanticweb.HermiT.Prefixes;
import org.semanticweb.HermiT.tableau.BranchingPoint;
import org.semanticweb.HermiT.tableau.ReasoningTaskDescription;
public class Timer extends TableauMonitorAdapter {
private static final long serialVersionUID=-8144444618897251350L;
protected transient PrintWriter m_output;
protected long m_problemStartTime;
protected long m_lastStatusTime;
protected int m_numberOfBacktrackings;
protected int m_testNumber=0;
public Timer() {
m_output=new PrintWriter(System.out);
}
public Timer(PrintWriter inOutput) {
m_output=inOutput;
}
protected Object readResolve() {
m_output=new PrintWriter(System.out);
return this;
}
protected void start() {
m_numberOfBacktrackings=0;
m_problemStartTime=System.currentTimeMillis();
m_lastStatusTime=m_problemStartTime;
}
public void isSatisfiableStarted(ReasoningTaskDescription reasoningTaskDescription) {
m_output.print(reasoningTaskDescription.getTaskDescription(Prefixes.STANDARD_PREFIXES)+" ...");
m_output.flush();
start();
}
public void isSatisfiableFinished(ReasoningTaskDescription reasoningTaskDescription,boolean result) {
if (reasoningTaskDescription.flipSatisfiabilityResult())
result=!result;
m_output.println(result ? "YES" : "NO");
doStatistics();
}
public void iterationStarted() {
if (System.currentTimeMillis()-m_lastStatusTime>30000) {
if (m_lastStatusTime==m_problemStartTime)
m_output.println();
doStatistics();
m_lastStatusTime=System.currentTimeMillis();
}
}
public void saturateStarted() {
m_testNumber++;
}
public void backtrackToFinished(BranchingPoint newCurrentBrancingPoint) {
m_numberOfBacktrackings++;
}
protected void doStatistics() {
long duartionSoFar=System.currentTimeMillis()-m_problemStartTime;
m_output.print(" Test: ");
printPadded(m_testNumber,7);
m_output.print(" Duration: ");
printPaddedMS(duartionSoFar,7);
m_output.print(" Current branching point: ");
printPadded(m_tableau.getCurrentBranchingPointLevel(),7);
if (m_numberOfBacktrackings>0) {
m_output.print(" Backtrackings: ");
m_output.print(m_numberOfBacktrackings);
}
m_output.println();
m_output.print(" Nodes: allocated: ");
printPadded(m_tableau.getNumberOfAllocatedNodes(),7);
m_output.print(" used: ");
printPadded(m_tableau.getNumberOfNodeCreations(),7);
m_output.print(" in tableau: ");
printPadded(m_tableau.getNumberOfNodesInTableau(),7);
if (m_tableau.getNumberOfMergedOrPrunedNodes()>0) {
m_output.print(" merged/pruned: ");
m_output.print(m_tableau.getNumberOfMergedOrPrunedNodes());
}
m_output.println();
m_output.print(" Sizes: binary table: ");
printPaddedKB(m_tableau.getExtensionManager().getBinaryExtensionTable().sizeInMemory()/1000,7);
m_output.print(" ternary table: ");
printPaddedKB(m_tableau.getExtensionManager().getTernaryExtensionTable().sizeInMemory()/1000,7);
m_output.print(" dependency set factory: ");
printPaddedKB(m_tableau.getDependencySetFactory().sizeInMemory()/1000,7);
m_output.println();
m_output.println();
m_output.flush();
}
protected void printPadded(int number,int padding) {
String numberString=String.valueOf(number);
m_output.print(numberString);
for (int index=numberString.length();index<padding;index++)
m_output.print(' ');
}
protected void printPaddedMS(long number,int padding) {
String numberString=String.valueOf(number)+" ms";
m_output.print(numberString);
for (int index=numberString.length();index<padding;index++)
m_output.print(' ');
}
protected void printPaddedKB(int number,int padding) {
String numberString=String.valueOf(number)+" kb";
m_output.print(numberString);
for (int index=numberString.length();index<padding;index++)
m_output.print(' ');
}
}