All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jadex.rules.examples.fibonacci.OAVFibonacci Maven / Gradle / Ivy

package jadex.rules.examples.fibonacci;

import jadex.rules.rulesystem.IAction;
import jadex.rules.rulesystem.ICondition;
import jadex.rules.rulesystem.IVariableAssignments;
import jadex.rules.rulesystem.PriorityAgenda;
import jadex.rules.rulesystem.RuleSystem;
import jadex.rules.rulesystem.RuleSystemExecutor;
import jadex.rules.rulesystem.Rulebase;
import jadex.rules.rulesystem.rete.RetePatternMatcherFunctionality;
import jadex.rules.rulesystem.rules.AndCondition;
import jadex.rules.rulesystem.rules.BoundConstraint;
import jadex.rules.rulesystem.rules.FunctionCall;
import jadex.rules.rulesystem.rules.IOperator;
import jadex.rules.rulesystem.rules.IPriorityEvaluator;
import jadex.rules.rulesystem.rules.LiteralConstraint;
import jadex.rules.rulesystem.rules.ObjectCondition;
import jadex.rules.rulesystem.rules.PredicateConstraint;
import jadex.rules.rulesystem.rules.Rule;
import jadex.rules.rulesystem.rules.Variable;
import jadex.rules.rulesystem.rules.functions.OperatorFunction;
import jadex.rules.rulesystem.rules.functions.Sub;
import jadex.rules.state.IOAVState;
import jadex.rules.state.OAVAttributeType;
import jadex.rules.state.OAVJavaType;
import jadex.rules.state.OAVObjectType;
import jadex.rules.state.OAVTypeModel;
import jadex.rules.state.javaimpl.OAVStateFactory;
import jadex.rules.tools.reteviewer.RuleEnginePanel;

/**
 *  Calculating fibonacci numbers example.
 */
public class OAVFibonacci
{
	/**
	 *  Main method.
	 *  @param args The arguments.
	 */
	public static void main(String[] args)
	{
		// Create rete system.
		OAVTypeModel fibonacci_type_model = new OAVTypeModel("fibonacci_type_model");
		fibonacci_type_model.addTypeModel(OAVJavaType.java_type_model);
		final OAVObjectType fibo_type = fibonacci_type_model.createType("fibo_type"); 
		final OAVAttributeType fibo_has_value = fibo_type.createAttributeType("fibo_has_value", OAVJavaType.java_long_type);
		final OAVAttributeType fibo_has_sequence = fibo_type.createAttributeType("fibo_has_sequence", OAVJavaType.java_integer_type);

		IOAVState state = OAVStateFactory.createOAVState(fibonacci_type_model); // Create the production memory.
		Rulebase rb	= new Rulebase();
		RuleSystem rete = new RuleSystem(state, rb, new RetePatternMatcherFunctionality(rb), new PriorityAgenda());
			
		// Add rules to rulebase.
		
		Variable fn = new Variable("?fn", fibo_type);
		ObjectCondition fncon = new ObjectCondition(fibo_type);
		fncon.addConstraint(new BoundConstraint(null, fn));
		fncon.addConstraint(new LiteralConstraint(fibo_has_value, Long.valueOf(-1)));
		rete.getRulebase().addRule(new Rule("recurse", fncon, new IAction()
		{
			public void execute(IOAVState state, IVariableAssignments assignments)
			{
				Object fn = assignments.getVariableValue("?fn");
				int fncnt = ((Integer)state.getAttributeValue(fn, fibo_has_sequence)).intValue();
				System.out.println("recurse for "+fncnt);
				
				Object fm = state.createRootObject(fibo_type);
				state.setAttributeValue(fm, fibo_has_value, Long.valueOf(-1));
				state.setAttributeValue(fm, fibo_has_sequence, Integer.valueOf(fncnt-1));
			}
		}, IPriorityEvaluator.PRIORITY_1));

		Variable f1 = new Variable("?f1", fibo_type);
		ObjectCondition f1con = new ObjectCondition(fibo_type);
		f1con.addConstraint(new BoundConstraint(null, f1));
		f1con.addConstraint(new LiteralConstraint(fibo_has_value, Long.valueOf(-1)));
		f1con.addConstraint(new LiteralConstraint(fibo_has_sequence, Integer.valueOf(1)));
		rete.getRulebase().addRule(new Rule("bootstrap1", f1con, new IAction()
		{
			public void execute(IOAVState state, IVariableAssignments assignments)
			{
				Object f1 = assignments.getVariableValue("?f1");
				int f1cnt = ((Integer)state.getAttributeValue(f1, fibo_has_sequence)).intValue();
				state.setAttributeValue(f1, fibo_has_value, Long.valueOf(1));
				long f1num = ((Long)state.getAttributeValue(f1, fibo_has_value)).longValue();
				System.out.println("f"+f1cnt+"="+f1num);
			}
		}, IPriorityEvaluator.PRIORITY_2));
		
		Variable f2 = new Variable("?f2", fibo_type);
		ObjectCondition f2con = new ObjectCondition(fibo_type);
		f2con.addConstraint(new BoundConstraint(null, f2));
		f2con.addConstraint(new LiteralConstraint(fibo_has_value, Long.valueOf(-1)));
		f2con.addConstraint(new LiteralConstraint(fibo_has_sequence, Integer.valueOf(2)));
		rete.getRulebase().addRule(new Rule("bootstrap2", f2con, new IAction()
		{
			public void execute(IOAVState state, IVariableAssignments assignments)
			{
				Object f2 = assignments.getVariableValue("?f2");
				int f2cnt = ((Integer)state.getAttributeValue(f2, fibo_has_sequence)).intValue();
				state.setAttributeValue(f2, fibo_has_value, Long.valueOf(1));
				long f2num = ((Long)state.getAttributeValue(f2, fibo_has_value)).longValue();
				System.out.println("f"+f2cnt+"="+f2num);
			}
		}));
		
		Variable f0 = new Variable("?f0", fibo_type);
		Variable f0seq = new Variable("?f0seq", OAVJavaType.java_integer_type);
//		Variable f1 = new Variable("?f1", fibo_type);
		Variable f1seq = new Variable("?f1seq", OAVJavaType.java_integer_type);
//		Variable f2 = new Variable("?f2", fibo_type);
		Variable f2seq = new Variable("?f2seq", OAVJavaType.java_integer_type);
		
		ObjectCondition f00con = new ObjectCondition(fibo_type);
		f00con.addConstraint(new BoundConstraint(null, f0));
		f00con.addConstraint(new BoundConstraint(fibo_has_sequence, f0seq));
		f00con.addConstraint(new LiteralConstraint(fibo_has_value, Long.valueOf(-1), IOperator.NOTEQUAL));
		
		ObjectCondition f11con = new ObjectCondition(fibo_type);
		f11con.addConstraint(new BoundConstraint(null, f1));
		f11con.addConstraint(new BoundConstraint(fibo_has_sequence, f1seq));
		f11con.addConstraint(new PredicateConstraint(new FunctionCall(new OperatorFunction(IOperator.EQUAL), 
			new Object[]{f0seq, new FunctionCall(new Sub(), new Object[]{f1seq, Integer.valueOf(1)})})));
		f11con.addConstraint(new LiteralConstraint(fibo_has_value, Long.valueOf(-1), IOperator.NOTEQUAL));
		
		ObjectCondition f22con = new ObjectCondition(fibo_type);
		f22con.addConstraint(new BoundConstraint(null, f2));
		f22con.addConstraint(new BoundConstraint(fibo_has_sequence, f2seq));
		f22con.addConstraint(new LiteralConstraint(fibo_has_value, Long.valueOf(-1)));
		f22con.addConstraint(new PredicateConstraint(new FunctionCall(new OperatorFunction(IOperator.EQUAL), 
			new Object[]{f1seq, new FunctionCall(new Sub(), new Object[]{f2seq, Integer.valueOf(1)})})));
		
		rete.getRulebase().addRule(new Rule("calc", new AndCondition(new ICondition[]{f00con, f11con, f22con}), new IAction()
		{
			public void execute(IOAVState state, IVariableAssignments assignments)
			{
				Object f0 = assignments.getVariableValue("?f0");
				Object f1 = assignments.getVariableValue("?f1");
				Object f2 = assignments.getVariableValue("?f2");
				long f0num = ((Long)state.getAttributeValue(f0, fibo_has_value)).longValue();
				long f1num = ((Long)state.getAttributeValue(f1, fibo_has_value)).longValue();
				int f1cnt = ((Integer)state.getAttributeValue(f1, fibo_has_sequence)).intValue();
				long f2num = f0num+f1num;
				state.setAttributeValue(f2, fibo_has_value, Long.valueOf(f2num));
				System.out.println("f"+(f1cnt+1)+"="+f2num);
			}
		}));
		
		Object f50 = state.createRootObject(fibo_type);
		state.setAttributeValue(f50, fibo_has_value, Integer.valueOf(-1));
		state.setAttributeValue(f50, fibo_has_sequence, Integer.valueOf(50));
		
		// Initialize rule system.
		rete.init();
		
//		long start = System.currentTimeMillis();
//		rete.fireAllRules();
//		long stop = System.currentTimeMillis();
//		System.out.println( "fibanacci(" + state.getAttributeValue(f50, fibo_has_sequence) + ") = " + 
//			state.getAttributeValue(f50, fibo_has_value) + " took " + (stop-start) + "ms" );
		
		RuleSystemExecutor exe = new RuleSystemExecutor(rete, true);
		RuleEnginePanel.createRuleEngineFrame(exe, "Fibonacci");
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy