/* * Copyright 2011 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.semantics.lang.dl; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.RuleBaseConfiguration; import org.drools.RuleBaseConfiguration.AssertBehaviour; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.common.DefaultFactHandle; import org.drools.common.EventFactHandle; import org.drools.core.util.StringUtils; import org.drools.io.Resource; import org.drools.io.impl.ByteArrayResource; import org.drools.io.impl.ClassPathResource; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.rule.FactHandle; import org.drools.runtime.rule.QueryResults; import org.drools.runtime.rule.QueryResultsRow; import org.drools.semantics.builder.DLReasonerBuilder; import org.drools.semantics.builder.DLReasonerBuilderImpl; import org.drools.semantics.lang.dl.DLGoal; import org.drools.semantics.lang.dl.MinimizationProblem; import org.drools.semantics.lang.dl.RecognitionGoal; import org.drools.semantics.lang.dl.SubsumptionGoal; import org.junit.After; import org.semanticweb.owlapi.model.OWLOntology; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.PriorityQueue; import static org.junit.Assert.*; /** * This is a sample class to launch a rule. */ @Deprecated public class AbstractReasonerTestBase { protected DLReasonerBuilder factory = DLReasonerBuilderImpl.getInstance(); protected KnowledgeBase tableauKB; protected StatefulKnowledgeSession ksession; protected Object mock; private String currentSource = null; private OWLOntology currentOntology = null; public OWLOntology init( String DLfile ) { // get ontology... if ( DLfile.equals( currentSource ) ) { reinit(); return currentOntology; } OWLOntology ontologyDescr = factory.parseOntology( new ClassPathResource( DLfile ) ); currentOntology = ontologyDescr; currentSource = DLfile; // compile tableau from DL... ClassPathResource visitor = new ClassPathResource( "FALC_TableauBuilderVisitor.drl" ); visitor.setResourceType( ResourceType.DRL ); ClassPathResource common = new ClassPathResource( "FALC_CommonVisitor.drl" ); common.setResourceType( ResourceType.DRL ); String tableau = factory.buildTableauRules( ontologyDescr, new Resource[] { common, visitor } ); System.err.println("<<<" + tableau + ">>>"); assertFalse(StringUtils.isEmpty(tableau)); RuleBaseConfiguration kconf = new RuleBaseConfiguration(); kconf.setAssertBehaviour(AssertBehaviour.EQUALITY); tableauKB = KnowledgeBaseFactory.newKnowledgeBase(kconf); assertNotNull(tableauKB); // add main rulebase KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( new ByteArrayResource( tableau.getBytes() ), ResourceType.DRL); kbuilder.add( new ClassPathResource("fuzzyDL/Main.drl"), ResourceType.DRL); if ( kbuilder.hasErrors() ) { fail( kbuilder.getErrors().toString() ); } tableauKB.addKnowledgePackages(kbuilder.getKnowledgePackages()); assertNotNull(tableauKB); reinit(); return ontologyDescr; } public void reinit() { // get session and provide solver ksession = tableauKB.newStatefulKnowledgeSession(); // just in case... ksession.fireAllRules(); // System.err.println(reportWMObjects(ksession)); QueryResults results = ksession.getQueryResults( "q_mock", "m01" ); if (results.iterator().hasNext()) { QueryResultsRow ans = results.iterator().next(); mock = ans.get("$m"); assertNotNull(mock); } // System.err.println(" GO WITH TEST GOAL \n\n\n\n\n\n\n"); // System.out.println(" GO WITH TEST GOAL \n\n\n\n\n\n\n"); } @After public void destroy() { // it is a good day... ksession.dispose(); } protected void testRecognition(String klass, double tgtTau, double tgtPhi) { DLGoal goal = new RecognitionGoal(klass,true); ksession.insert(goal); ksession.fireAllRules(); // System.err.println("Objects in WM " + ksession.getObjects().size()); // for (Object o : ksession.getObjects()) // System.err.println(o); QueryResults results2 = ksession.getQueryResults( "q_recognition", mock, klass ); Iterator<QueryResultsRow> iter2 = results2.iterator(); Number tau = 0.0; Number phi = 1.0; while (iter2.hasNext()) { QueryResultsRow ans2 = iter2.next(); tau = Math.max(tau.doubleValue(),((Number) ans2.get("$tau")).doubleValue()); phi = Math.min(phi.doubleValue(),((Number) ans2.get("$phi")).doubleValue()); System.err.println(mock + " isA " + klass+ " >> [" + tau + " : " + phi + "]"); } assertEquals("delta_tau",tgtTau,tau.doubleValue(),MinimizationProblem.precision); assertEquals("delta_phi",tgtPhi,phi.doubleValue(),MinimizationProblem.precision); } protected void testSubsumption(String sub, String sup, double tgtTau, double tgtPhi) { DLGoal goal = new SubsumptionGoal(sub,sup,true); ksession.insert(goal); ksession.fireAllRules(); QueryResults results2 = ksession.getQueryResults( "q_subsumptionAll", sub, sup ); Iterator<QueryResultsRow> iter2 = results2.iterator(); Number tau = 0.0; Number phi = 1.0; while (iter2.hasNext()) { QueryResultsRow ans2 = iter2.next(); tau = Math.max(tau.doubleValue(),((Number) ans2.get("$tau")).doubleValue()); phi = Math.min(phi.doubleValue(),((Number) ans2.get("$phi")).doubleValue()); System.err.println(sub + " subConceptOf" + sup + " >> [" + tau + " : " + phi + "]"); } // System.out.println("Objects in WM " + ksession.getObjects().size()); // for (Object o : ksession.getObjects()) // System.out.println(o); assertEquals( "delta_tau",tgtTau,tau.doubleValue(), MinimizationProblem.precision ); assertEquals( "delta_phi",tgtPhi,phi.doubleValue(), MinimizationProblem.precision ); } protected static boolean logFile(String fileName, String content) { try { // System.out.println(new File(".").getAbsolutePath()); FileOutputStream fw = new FileOutputStream(fileName); byte[] drl = content.getBytes(); fw.write(drl,0,drl.length); fw.flush(); fw.close(); return true; } catch (IOException ioe) { ioe.printStackTrace(); return false; } } public String reportWMObjects(StatefulKnowledgeSession session) { PriorityQueue<String> queue = new PriorityQueue<String>(); for (FactHandle fh : session.getFactHandles()) { Object o; if (fh instanceof EventFactHandle) { EventFactHandle efh = (EventFactHandle) fh; queue.add("\t " + efh.getStartTimestamp() + "\t" + efh.getObject().toString() + "\n"); } else { o = ((DefaultFactHandle) fh).getObject(); queue.add("\t " + o.toString() + "\n"); } } String ans = " ---------------- WM " + session.getObjects().size() + " --------------\n"; while (! queue.isEmpty()) ans += queue.poll(); ans += " ---------------- END WM -----------\n"; return ans; } }