001: /******************************************************************
002: * File: GoalTable.java
003: * Created by: Dave Reynolds
004: * Created on: 03-May-2003
005: *
006: * (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
007: * [See end of file]
008: * $Id: GoalTable.java,v 1.8 2008/01/02 12:09:45 andy_seaborne Exp $
009: *****************************************************************/package com.hp.hpl.jena.reasoner.rulesys.impl.oldCode;
010:
011: import com.hp.hpl.jena.reasoner.*;
012:
013: import java.util.*;
014: import org.apache.commons.logging.Log;
015: import org.apache.commons.logging.LogFactory;
016:
017: /**
018: * Part of the backwared chaining rule interpreter. The goal table
019: * is a table of partially evaluated goals. This could be done by
020: * variant-based or sumsumption-based tabling. We currently use variant-based.
021: * TODO Investigate performance impact of switching to subsumption-based.
022: *
023: * @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
024: * @version $Revision: 1.8 $ on $Date: 2008/01/02 12:09:45 $
025: */
026: public class GoalTable {
027:
028: /** The set of goal entries indexed by goal */
029: protected Map table = new HashMap();
030:
031: /** The parent inference engine for the goal table */
032: protected BRuleEngine ruleEngine;
033:
034: static Log logger = LogFactory.getLog(GoalTable.class);
035:
036: /**
037: * Constructor. Creates a new, empty GoalTable. Any goal search on
038: * this table will include the results from searching the given set of
039: * raw data graphs.
040: * @param ruleEngine the parent inference engine instance for this table
041: */
042: public GoalTable(BRuleEngine ruleEngine) {
043: this .ruleEngine = ruleEngine;
044: }
045:
046: /**
047: * Find the set of memoized solutions for the given goal
048: * and return a GoalState that can traverse all the solutions.
049: *
050: * @param goal the goal to be solved
051: * @return a GoalState which can iterate over all of the goal solutions
052: */
053: public GoalState findGoal(TriplePattern goal) {
054: // if (ruleEngine.getInfGraph().isTraceOn()) {
055: // logger.debug("findGoal on " + goal.toString());
056: // }
057: GoalResults results = (GoalResults) table.get(goal);
058: if (results == null || !goal.variantOf(results.goal)) {
059: results = new GoalResults(goal, ruleEngine);
060: table.put(goal, results);
061: }
062: return new GoalState(ruleEngine.getInfGraph().findDataMatches(
063: goal), results);
064: }
065:
066: /**
067: * Clear all tabled results.
068: */
069: public void reset() {
070: table = new HashMap();
071: }
072:
073: /**
074: * Clear all partial results, closing any pending RuleStates but leaving
075: * completed goals intact.
076: */
077: public void removePartialGoals() {
078: for (Iterator i = table.entrySet().iterator(); i.hasNext();) {
079: Map.Entry entry = (Map.Entry) i.next();
080: TriplePattern goal = (TriplePattern) entry.getKey();
081: GoalResults result = (GoalResults) entry.getValue();
082: if (!result.isComplete()) {
083: // Close any iterators in the dependent goal states.
084: for (Iterator d = result.dependents.iterator(); d
085: .hasNext();) {
086: RuleState rs = (RuleState) d.next();
087: if (rs.goalState != null)
088: rs.goalState.close();
089: }
090: i.remove();
091: }
092: }
093: }
094:
095: /**
096: * Set all the goals in the table to "complete".
097: */
098: public void setAllComplete() {
099: for (Iterator i = table.values().iterator(); i.hasNext();) {
100: ((GoalResults) i.next()).setAllComplete();
101: }
102: }
103:
104: /**
105: * Dump an a summary of the goal table state to stdout.
106: * Just debugging, do not use for real.
107: */
108: public void dump() {
109: System.out.println("Final goal table");
110: for (Iterator i = table.values().iterator(); i.hasNext();) {
111: GoalResults gr = (GoalResults) i.next();
112: System.out.println(gr.toString());
113: for (int j = 0; j < gr.numResults(); j++) {
114: System.out.println(" - " + gr.getResult(j));
115: }
116: }
117: }
118:
119: }
120:
121: /*
122: (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
123: All rights reserved.
124:
125: Redistribution and use in source and binary forms, with or without
126: modification, are permitted provided that the following conditions
127: are met:
128:
129: 1. Redistributions of source code must retain the above copyright
130: notice, this list of conditions and the following disclaimer.
131:
132: 2. Redistributions in binary form must reproduce the above copyright
133: notice, this list of conditions and the following disclaimer in the
134: documentation and/or other materials provided with the distribution.
135:
136: 3. The name of the author may not be used to endorse or promote products
137: derived from this software without specific prior written permission.
138:
139: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
140: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
141: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
142: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
143: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
144: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
145: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
146: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
147: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
148: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
149: */
|