/*
* 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.pmml.pmml_4_1.predictive.models;
import junit.framework.Assert;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.ObjectFilter;
import org.drools.agent.ChangeSetHelperImpl;
import org.drools.agent.KnowledgeAgent;
import org.drools.agent.KnowledgeAgentConfiguration;
import org.drools.agent.KnowledgeAgentFactory;
import org.drools.agent.conf.NewInstanceOption;
import org.drools.agent.conf.UseKnowledgeBaseClassloaderOption;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.io.impl.ClassPathResource;
import org.drools.pmml.pmml_4_1.DroolsAbstractPMMLTest;
import org.drools.pmml.pmml_4_1.ModelMarker;
import org.drools.runtime.StatefulKnowledgeSession;
import org.junit.Test;
import java.util.Collection;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class CleanupTest extends DroolsAbstractPMMLTest {
private static final String source1 = "org/drools/pmml/pmml_4_1//test_ann_iris_prediction.xml";
private static final String source2 = "org/drools/pmml/pmml_4_1//test_tree_simple.xml";
private static final String source3 = "org/drools/pmml/pmml_4_1//test_regression.xml";
private static final String source4 = "org/drools/pmml/pmml_4_1//test_clustering.xml";
private static final String source5 = "org/drools/pmml/pmml_4_1//test_svm.xml";
private static final String source6 = "org/drools/pmml/pmml_4_1//test_scorecard.xml";
private static final String source9 = "org/drools/pmml/pmml_4_1//mock_cold.xml";
private static final String packageName = "org.drools.pmml.pmml_4_1.test";
@Test
public void testCleanupANN() {
StatefulKnowledgeSession kSession = loadModel( source1 );
assertTrue( kSession.getObjects().size() > 0 );
Collection qres = getModelMarker( kSession, "Neuiris" );
assertEquals( 1, qres.size() );
kSession.getWorkingMemoryEntryPoint( "enable_Neuiris" ).insert( Boolean.FALSE );
kSession.fireAllRules();
System.err.println(reportWMObjects(kSession));
assertEquals( 1, kSession.getObjects().size() );
kSession.dispose();
}
private Collection getModelMarker( final StatefulKnowledgeSession kSession, final String modelName ) {
return kSession.getObjects( new ObjectFilter() {
public boolean accept( Object o ) {
return o instanceof ModelMarker && modelName.equals( ((ModelMarker) o).getModelName() );
}
} );
}
@Test
public void testReenableANN() {
setKSession( loadModel( source1 ) );
assertTrue( getKSession().getObjects().size() > 0 );
Collection qres = getModelMarker( getKSession(), "Neuiris" );
assertEquals( 1, qres.size() );
getKSession().getWorkingMemoryEntryPoint( "enable_Neuiris" ).insert( Boolean.FALSE );
getKSession().fireAllRules();
System.err.println(reportWMObjects(getKSession()));
assertEquals( 1, getKSession().getObjects().size() );
getKSession().getWorkingMemoryEntryPoint( "enable_Neuiris" ).insert( Boolean.TRUE );
getKSession().fireAllRules();
System.err.println( reportWMObjects(getKSession()) );
getKSession().getWorkingMemoryEntryPoint("in_PetalNum").insert(101);
getKSession().getWorkingMemoryEntryPoint("in_PetalWid").insert(2);
getKSession().getWorkingMemoryEntryPoint("in_Species").insert("virginica");
getKSession().getWorkingMemoryEntryPoint("in_SepalWid").insert(30);
getKSession().fireAllRules();
System.err.println(reportWMObjects(getKSession()));
Assert.assertEquals(24.0, queryIntegerField("OutSepLen", "Neuiris"));
assertEquals( 61, getKSession().getObjects().size() );
getKSession().dispose();
}
@Test
public void testCleanupDT() {
StatefulKnowledgeSession kSession = loadModel( source2 );
assertTrue( kSession.getObjects().size() > 0 );
Collection qres = getModelMarker( kSession, "TreeTest" );
assertEquals( 1, qres.size() );
kSession.getWorkingMemoryEntryPoint( "enable_TreeTest" ).insert(Boolean.FALSE);
kSession.fireAllRules();
System.err.println(reportWMObjects(kSession));
assertEquals( 1, kSession.getObjects().size() );
kSession.dispose();
}
@Test
public void testCleanupRegression() {
StatefulKnowledgeSession kSession = loadModel( source3 );
assertTrue( kSession.getObjects().size() > 0 );
Collection qres = getModelMarker( kSession, "LinReg" );
assertEquals( 1, qres.size() );
kSession.getWorkingMemoryEntryPoint( "enable_LinReg" ).insert(Boolean.FALSE);
kSession.fireAllRules();
System.err.println(reportWMObjects(kSession));
assertEquals( 1, kSession.getObjects().size() );
kSession.dispose();
}
@Test
public void testCleanupClustering() {
StatefulKnowledgeSession kSession = loadModel( source4 );
assertTrue( kSession.getObjects().size() > 0 );
Collection qres = getModelMarker( kSession, "CenterClustering" );
assertEquals( 1, qres.size() );
kSession.getWorkingMemoryEntryPoint( "enable_CenterClustering" ).insert(Boolean.FALSE);
kSession.fireAllRules();
System.err.println(reportWMObjects(kSession));
assertEquals( 1, kSession.getObjects().size() );
kSession.dispose();
}
@Test
public void testCleanupSVM() {
StatefulKnowledgeSession kSession = loadModel( source5 );
assertTrue( kSession.getObjects().size() > 0 );
Collection qres = getModelMarker( kSession, "SVMXORModel" );
assertEquals( 1, qres.size() );
kSession.getWorkingMemoryEntryPoint( "enable_SVMXORModel" ).insert(Boolean.FALSE);
kSession.fireAllRules();
System.err.println(reportWMObjects(kSession));
assertEquals( 1, kSession.getObjects().size() );
kSession.dispose();
}
@Test
public void testCleanupScorecard() {
StatefulKnowledgeSession kSession = loadModel( source6 );
assertTrue( kSession.getObjects().size() > 0 );
Collection qres = getModelMarker( kSession, "SampleScore" );
assertEquals( 1, qres.size() );
kSession.getWorkingMemoryEntryPoint( "enable_SampleScore" ).insert(Boolean.FALSE);
kSession.fireAllRules();
System.err.println(reportWMObjects(kSession));
assertEquals( 1, kSession.getObjects().size() );
kSession.dispose();
}
@Test
public void testCleanupANNRulesWithIncrementalKA() {
KnowledgeAgent kAgent = initIncrementalKA();
// kAgent.setSystemEventListener( new PrintStreamSystemEventListener() );
KnowledgeBase kBase = kAgent.getKnowledgeBase();
StatefulKnowledgeSession kSession = kBase.newStatefulKnowledgeSession();
ChangeSetHelperImpl csAdd = new ChangeSetHelperImpl();
ClassPathResource res = (ClassPathResource) ResourceFactory.newClassPathResource( source1 );
res.setResourceType( ResourceType.PMML );
ClassPathResource res2 = (ClassPathResource) ResourceFactory.newClassPathResource( source9 );
res2.setResourceType( ResourceType.PMML );
csAdd.addNewResource(res);
csAdd.addNewResource( res2 );
System.out.println( "************************ ADDING resources ");
kAgent.applyChangeSet( csAdd.getChangeSet() );
assertTrue( kBase.getKnowledgePackage( packageName ).getRules().size() > 0 );
kSession.fireAllRules();
assertTrue( kSession.getObjects().size() > 0 );
System.out.println( "************************ REMOVING resource 1 ");
ChangeSetHelperImpl csRem = new ChangeSetHelperImpl();
csRem.addRemovedResource( res );
kAgent.applyChangeSet( csRem .getChangeSet() );
kSession.fireAllRules();
assertEquals( 40, kBase.getKnowledgePackage( packageName ).getRules().size() );
System.out.println( "************************ REMOVING resource 2 ");
ChangeSetHelperImpl csRem2 = new ChangeSetHelperImpl();
csRem2.addRemovedResource( res2 );
kAgent.applyChangeSet( csRem2.getChangeSet() );
kSession.fireAllRules();
System.out.println(reportWMObjects(kSession));
assertEquals( 0, kBase.getKnowledgePackage( packageName ).getRules().size() );
System.err.println( reportWMObjects( kSession ) );
assertEquals( 0, kSession.getObjects().size() );
kSession.dispose();
kAgent.dispose();
}
@Test
public void testCleanupDTRulesWithIncrementalKA() {
KnowledgeAgent kAgent = initIncrementalKA();
// kAgent.setSystemEventListener( new PrintStreamSystemEventListener() );
KnowledgeBase kBase = kAgent.getKnowledgeBase();
StatefulKnowledgeSession kSession = kBase.newStatefulKnowledgeSession();
ChangeSetHelperImpl csAdd = new ChangeSetHelperImpl();
ClassPathResource res = (ClassPathResource) ResourceFactory.newClassPathResource( source2 );
res.setResourceType( ResourceType.PMML );
csAdd.addNewResource(res);
System.out.println( "************************ ADDING resources ");
kAgent.applyChangeSet( csAdd.getChangeSet() );
assertTrue( kBase.getKnowledgePackage( packageName ).getRules().size() > 0 );
kSession.fireAllRules();
assertTrue( kSession.getObjects().size() > 0 );
System.out.println( "************************ REMOVING resource 1 ");
ChangeSetHelperImpl csRem = new ChangeSetHelperImpl();
csRem.addRemovedResource( res );
kAgent.applyChangeSet( csRem .getChangeSet() );
kSession.fireAllRules();
assertEquals( 0, kBase.getKnowledgePackage( packageName ).getRules().size() );
System.err.println( reportWMObjects( kSession ) );
assertEquals( 0, kSession.getObjects().size() );
kSession.dispose();
kAgent.dispose();
}
@Test
public void testCleanupClusteringRulesWithIncrementalKA() {
KnowledgeAgent kAgent = initIncrementalKA();
// kAgent.setSystemEventListener( new PrintStreamSystemEventListener() );
KnowledgeBase kBase = kAgent.getKnowledgeBase();
StatefulKnowledgeSession kSession = kBase.newStatefulKnowledgeSession();
ChangeSetHelperImpl csAdd = new ChangeSetHelperImpl();
ClassPathResource res = (ClassPathResource) ResourceFactory.newClassPathResource( source3 );
res.setResourceType( ResourceType.PMML );
csAdd.addNewResource(res);
System.out.println( "************************ ADDING resources ");
kAgent.applyChangeSet( csAdd.getChangeSet() );
assertTrue( kBase.getKnowledgePackage( packageName ).getRules().size() > 0 );
kSession.fireAllRules();
assertTrue( kSession.getObjects().size() > 0 );
System.out.println( "************************ REMOVING resource 1 ");
ChangeSetHelperImpl csRem = new ChangeSetHelperImpl();
csRem.addRemovedResource( res );
kAgent.applyChangeSet( csRem .getChangeSet() );
kSession.fireAllRules();
assertEquals( 0, kBase.getKnowledgePackage( packageName ).getRules().size() );
System.err.println( reportWMObjects( kSession ) );
assertEquals( 0, kSession.getObjects().size() );
kSession.dispose();
kAgent.dispose();
}
@Test
public void testCleanupRegressionRulesWithIncrementalKA() {
KnowledgeAgent kAgent = initIncrementalKA();
// kAgent.setSystemEventListener( new PrintStreamSystemEventListener() );
KnowledgeBase kBase = kAgent.getKnowledgeBase();
StatefulKnowledgeSession kSession = kBase.newStatefulKnowledgeSession();
ChangeSetHelperImpl csAdd = new ChangeSetHelperImpl();
ClassPathResource res = (ClassPathResource) ResourceFactory.newClassPathResource( source4 );
res.setResourceType( ResourceType.PMML );
csAdd.addNewResource(res);
System.out.println( "************************ ADDING resources ");
kAgent.applyChangeSet( csAdd.getChangeSet() );
assertTrue( kBase.getKnowledgePackage( packageName ).getRules().size() > 0 );
kSession.fireAllRules();
assertTrue( kSession.getObjects().size() > 0 );
System.out.println( "************************ REMOVING resource 1 ");
ChangeSetHelperImpl csRem = new ChangeSetHelperImpl();
csRem.addRemovedResource( res );
kAgent.applyChangeSet( csRem .getChangeSet() );
kSession.fireAllRules();
assertEquals( 0, kBase.getKnowledgePackage( packageName ).getRules().size() );
System.err.println( reportWMObjects( kSession ) );
assertEquals( 0, kSession.getObjects().size() );
kSession.dispose();
kAgent.dispose();
}
@Test
public void testCleanupSVMRulesWithIncrementalKA() {
KnowledgeAgent kAgent = initIncrementalKA();
// kAgent.setSystemEventListener( new PrintStreamSystemEventListener() );
KnowledgeBase kBase = kAgent.getKnowledgeBase();
StatefulKnowledgeSession kSession = kBase.newStatefulKnowledgeSession();
ChangeSetHelperImpl csAdd = new ChangeSetHelperImpl();
ClassPathResource res = (ClassPathResource) ResourceFactory.newClassPathResource( source5 );
res.setResourceType( ResourceType.PMML );
csAdd.addNewResource(res);
System.out.println( "************************ ADDING resources ");
kAgent.applyChangeSet( csAdd.getChangeSet() );
assertTrue( kBase.getKnowledgePackage( packageName ).getRules().size() > 0 );
kSession.fireAllRules();
assertTrue( kSession.getObjects().size() > 0 );
System.out.println( "************************ REMOVING resource 1 ");
ChangeSetHelperImpl csRem = new ChangeSetHelperImpl();
csRem.addRemovedResource( res );
kAgent.applyChangeSet( csRem .getChangeSet() );
kSession.fireAllRules();
assertEquals( 0, kBase.getKnowledgePackage( packageName ).getRules().size() );
System.err.println( reportWMObjects( kSession ) );
assertEquals( 0, kSession.getObjects().size() );
kSession.dispose();
kAgent.dispose();
}
@Test
public void testCleanupScorecardRulesWithIncrementalKA() {
KnowledgeAgent kAgent = initIncrementalKA();
// kAgent.setSystemEventListener( new PrintStreamSystemEventListener() );
KnowledgeBase kBase = kAgent.getKnowledgeBase();
StatefulKnowledgeSession kSession = kBase.newStatefulKnowledgeSession();
ChangeSetHelperImpl csAdd = new ChangeSetHelperImpl();
ClassPathResource res = (ClassPathResource) ResourceFactory.newClassPathResource( source6 );
res.setResourceType( ResourceType.PMML );
csAdd.addNewResource(res);
System.out.println( "************************ ADDING resources ");
kAgent.applyChangeSet( csAdd.getChangeSet() );
assertTrue( kBase.getKnowledgePackage( "org.drools.scorecards.example" ).getRules().size() > 0 );
kSession.fireAllRules();
assertTrue( kSession.getObjects().size() > 0 );
System.out.println( "************************ REMOVING resource 1 ");
ChangeSetHelperImpl csRem = new ChangeSetHelperImpl();
csRem.addRemovedResource( res );
kAgent.applyChangeSet( csRem .getChangeSet() );
kSession.fireAllRules();
assertEquals( 0, kBase.getKnowledgePackage( "org.drools.scorecards.example" ).getRules().size() );
System.err.println( reportWMObjects( kSession ) );
assertEquals( 0, kSession.getObjects().size() );
kSession.dispose();
kAgent.dispose();
}
private StatefulKnowledgeSession loadModel( String source ) {
KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
knowledgeBuilder.add( ResourceFactory.newClassPathResource( "org/drools/informer/informer-changeset.xml" ), ResourceType.CHANGE_SET );
knowledgeBuilder.add( ResourceFactory.newClassPathResource( source ), ResourceType.PMML );
if ( knowledgeBuilder.hasErrors() ) {
fail( knowledgeBuilder.getErrors().toString() );
}
KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
knowledgeBase.addKnowledgePackages( knowledgeBuilder.getKnowledgePackages() );
StatefulKnowledgeSession kSession = knowledgeBase.newStatefulKnowledgeSession();
kSession.fireAllRules();
return kSession;
}
private KnowledgeAgent initIncrementalKA() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newClassPathResource( "org/drools/informer/informer-changeset.xml" ), ResourceType.CHANGE_SET );
if ( kbuilder.hasErrors() ) {
fail( kbuilder.getErrors().toString() );
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
KnowledgeAgentConfiguration kaConfig = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
kaConfig.setProperty( NewInstanceOption.PROPERTY_NAME, "false" );
kaConfig.setProperty( UseKnowledgeBaseClassloaderOption.PROPERTY_NAME, "true" );
KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "testPmml", kbase, kaConfig );
return kagent;
}
}