/*
* 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 org.drools.ClassObjectFilter;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
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.factmodel.traits.Thing;
import org.drools.informer.Questionnaire;
import org.drools.io.Resource;
import org.drools.io.ResourceFactory;
import org.drools.io.impl.ByteArrayResource;
import org.drools.io.impl.ChangeSetImpl;
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.drools.runtime.rule.QueryResults;
import org.drools.runtime.rule.Variable;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.*;
public class MultipleModelTest extends DroolsAbstractPMMLTest {
private static final boolean VERBOSE = true;
private static final String source1 = "org/drools/pmml/pmml_4_1//mock_ptsd.xml";
private static final String source2 = "org/drools/pmml/pmml_4_1//mock_cold.xml";
private static final String source3 = "org/drools/pmml/pmml_4_1//mock_breastcancer.xml";
private static final String source4 = "org/drools/pmml/pmml_4_1//test_svm.xml";
private static final String packageName = "org.drools.pmml.pmml_4_1.test";
@Test
public void testInsertLogicalOnInitialFact() {
String s1 = "package org.drools.test.agent;\n" +
"import org.drools.pmml.pmml_4_1.ModelMarker; \n" +
"rule \"Init 1\"\n" +
"when\n" +
"then\n" +
" insertLogical( new ModelMarker( \"x\", \"xx\" ) );\n" +
"end\n" +
"" +
"rule MarkerLog\n" +
"when\n" +
" $m : ModelMarker()\n" +
"then\n" +
"System.out.println( $m );\n" +
"end\n";
String s2 = "package org.drools.test.agent;\n" +
"import org.drools.pmml.pmml_4_1.ModelMarker; \n" +
"rule \"Init 2\"\n" +
"when\n" +
"then\n" +
" insertLogical( new ModelMarker( \"y\", \"yy\" ) );\n" +
"end";
String s3 = "package org.drools.test.agent; \n" +
"import org.drools.pmml.pmml_4_1.ModelMarker; \n" +
"import org.drools.informer.ISurveyableTrait; \n" +
"rule \"TraitX\"\n" +
"salience 1000\n" +
"when\n" +
" $mm : ModelMarker( modelName == \"x\" , enabled == true ) @watch(!*) \n" +
"then\n" +
" ISurveyableTrait surv = don( $mm, ISurveyableTrait.class, true );\n" +
" modify ( surv ) {\n" +
" setQuestionnaireId( \"xid\" ),\n" +
" setStateful( false ),\n" +
" setSurveyEnabled( true );\n" +
" }\n" +
"end\n";
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newClassPathResource( "org/drools/informer/informer-changeset.xml" ), ResourceType.CHANGE_SET );
kbuilder.add( new ByteArrayResource( s3.getBytes() ), ResourceType.DRL );
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 );
StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
System.out.println("---------------------------------------------------------------------");
ByteArrayResource bres = (ByteArrayResource) ResourceFactory.newByteArrayResource( s1.getBytes() );
bres.setResourceType( ResourceType.DRL );
ChangeSetImpl cs = new ChangeSetImpl();
cs.setResourcesAdded(Arrays.<Resource>asList(bres));
kagent.applyChangeSet(cs);
ksession.fireAllRules();
System.out.println("---------------------------------------------------------------------");
ByteArrayResource bres2 = (ByteArrayResource) ResourceFactory.newByteArrayResource( s2.getBytes() );
bres2.setResourceType( ResourceType.DRL );
ChangeSetImpl cs2 = new ChangeSetImpl();
cs2.setResourcesAdded( Arrays.<Resource> asList( bres2 ) );
kagent.applyChangeSet( cs2 );
ksession.fireAllRules();
System.out.println("---------------------------------------------------------------------");
ksession.fireAllRules();
System.out.println("---------------------------------------------------------------------");
for ( Object o : ksession.getObjects() ) {
System.out.println( "**" + o );
}
assertEquals( 4, ksession.getObjects().size() );
assertEquals( 2, ksession.getObjects(new ClassObjectFilter( ModelMarker.class )).size() );
assertEquals( 1, ksession.getObjects(new ClassObjectFilter( Thing.class )).size() );
ksession.dispose();
kagent.dispose();
}
@Test
public void testIncrementalBuilding() throws Exception {
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() );
KnowledgeBuilder kb1 = KnowledgeBuilderFactory.newKnowledgeBuilder( kbase );
kb1.add( ResourceFactory.newClassPathResource( source1 ), ResourceType.PMML );
if ( kb1.hasErrors() ) { fail( kb1.getErrors().toString() ); }
kbase.addKnowledgePackages( kb1.getKnowledgePackages() );
KnowledgeBuilder kb2 = KnowledgeBuilderFactory.newKnowledgeBuilder( kbase );
kb2.add( ResourceFactory.newClassPathResource( source2 ), ResourceType.PMML );
if ( kb2.hasErrors() ) { fail( kb2.getErrors().toString() ); }
kbase.addKnowledgePackages( kb2.getKnowledgePackages() );
StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession();
kSession.fireAllRules();
System.err.println(reportWMObjects(kSession));
assertEquals( 2, kSession.getObjects( new ClassObjectFilter( ModelMarker.class ) ).size() );
assertEquals( 2, kSession.getObjects( new ClassObjectFilter( Questionnaire.class ) ).size() );
assertEquals( 11, kSession.getObjects( new ClassObjectFilter( kSession.getKnowledgeBase().getFactType( packageName, "Synapse" ).getFactClass() ) ).size() );
kSession.dispose();
}
@Test
public void testKnowledgeAgentLoadingMultipleANN() throws Exception {
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 );
StatefulKnowledgeSession kSession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
assertNotNull(kSession);
ChangeSetHelperImpl cs;
ClassPathResource res;
cs = new ChangeSetHelperImpl();
res = (ClassPathResource) ResourceFactory.newClassPathResource( source1 );
res.setResourceType( ResourceType.PMML );
cs.addNewResource( res );
kagent.applyChangeSet( cs.getChangeSet() );
kSession.fireAllRules();
System.out.println( " \n\n\n DONE LOADING " + source1 + " \n\n\n " );
QueryResults q1 = kSession.getQueryResults( "getQuestionnaireByType", "MockPTSD", Variable.v );
assertEquals( 1, q1.size() );
Questionnaire ptsdQ = (Questionnaire) q1.iterator().next().get( "$quest" );
cs = new ChangeSetHelperImpl();
res = (ClassPathResource) ResourceFactory.newClassPathResource( source2 );
res.setResourceType( ResourceType.PMML );
cs.addNewResource( res );
kagent.applyChangeSet( cs.getChangeSet() );
kSession.fireAllRules();
System.out.println( " \n\n\n DONE LOADING " + source2 + " \n\n\n " );
cs = new ChangeSetHelperImpl();
res = (ClassPathResource) ResourceFactory.newClassPathResource( source3 );
res.setResourceType( ResourceType.PMML );
cs.addNewResource( res );
kagent.applyChangeSet( cs.getChangeSet() );
kSession.fireAllRules();
System.out.println( " \n\n\n DONE LOADING " + source3 + " \n\n\n " );
kSession.fireAllRules();
QueryResults q2 = kSession.getQueryResults( "getQuestionnaireByType", "MockPTSD", Variable.v );
assertEquals( 1, q2.size() );
Questionnaire ptsdQ2 = (Questionnaire) q2.iterator().next().get( "$quest" );
assertSame( ptsdQ, ptsdQ2 );
System.err.println(reportWMObjects(kSession));
assertEquals( 3, kSession.getObjects( new ClassObjectFilter( ModelMarker.class ) ).size() );
assertEquals( 3, kSession.getObjects( new ClassObjectFilter( Questionnaire.class ) ).size() );
assertEquals( 23, kSession.getObjects( new ClassObjectFilter( kSession.getKnowledgeBase().getFactType( packageName, "Synapse" ).getFactClass() ) ).size() );
kSession.dispose();
kagent.dispose();
}
@Test
public void testKnowledgeAgentLoadingMix() throws Exception {
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 );
StatefulKnowledgeSession kSession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
assertNotNull(kSession);
ChangeSetHelperImpl cs;
ClassPathResource res;
cs = new ChangeSetHelperImpl();
res = (ClassPathResource) ResourceFactory.newClassPathResource( source1 );
res.setResourceType( ResourceType.PMML );
cs.addNewResource( res );
kagent.applyChangeSet( cs.getChangeSet() );
kSession.fireAllRules();
System.out.println( " \n\n\n DONE LOADING " + source1 + " \n\n\n " );
cs = new ChangeSetHelperImpl();
res = (ClassPathResource) ResourceFactory.newClassPathResource( source4 );
res.setResourceType( ResourceType.PMML );
cs.addNewResource( res );
kagent.applyChangeSet( cs.getChangeSet() );
kSession.fireAllRules();
System.out.println( " \n\n\n DONE LOADING " + source4 + " \n\n\n " );
kSession.fireAllRules();
System.err.println(reportWMObjects(kSession));
assertEquals( 2, kSession.getObjects( new ClassObjectFilter( ModelMarker.class ) ).size() );
assertEquals( 1, kSession.getObjects( new ClassObjectFilter( Questionnaire.class ) ).size() );
assertEquals( 9, kSession.getObjects( new ClassObjectFilter( kSession.getKnowledgeBase().getFactType( packageName, "Synapse" ).getFactClass() ) ).size() );
assertEquals( 4, kSession.getObjects( new ClassObjectFilter( kSession.getKnowledgeBase().getFactType( packageName, "SupportVector" ).getFactClass() ) ).size() );
kSession.dispose();
kagent.dispose();
}
}