[rules-users] Using eval in LHS

PriyaSha nash.8103 at gmail.com
Fri Jul 24 11:45:36 EDT 2009


Input: 
0,0,107,32,0,0,0,10,53320,-1,-1,-1,-1,-1,-1
0,0,107,32,0,0,0,10,53320,-1,-1,-1,-1,-1,-1
0,0,107,32,0,0,0,10,53320,-1,-1,-1,-1,-1,-1
0,0,107,32,0,0,0,10,53320,-1,-1,-1,-1,-1,-1
0,0,109,20,0,0,0,19,100644,-1,-1,-1,-1,-1,-1
0,0,109,20,0,0,0,19,100644,-1,-1,-1,-1,-1,-1
0,0,106,28,0,0,0,26,137745,-1,-1,-1,-1,-1,-1
0,0,108,32,0,0,0,67,354281,-1,-1,-1,-1,-1,-1
0,0,105,30,0,0,1,94,501089,-1,-1,-1,-1,-1,-1

Problem:

Should find vehicles with same data (if it occurs more than thrice).

Though eval in rule 'Detect Accident' results in true, consequence is not
fired.

Output:

Added
Not Found -- 107---2
test---2----107
Not Found -- 107---3
test---3----107
Not Found -- 107---4
test---4----107
no of veh : 1
no of veh : 1
no of veh : 1
Not Found -- 109---5
test---1----109
Not Found -- 109---6
test---2----109
Not Found -- 106---7

Please find the DRL below.


package com.hp.hpl.CHAOS.LR;

# importing classes
import java.lang.Integer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import com.hp.hpl.CHAOS.Rules.VehicleLocation;

global java.lang.String output

declare VehicleLocation
    @role    ( event )
    @expires ( 1m )
end 

declare Statistics
    smashedcars  : ArrayList
    stopped_cars : ArrayList
    accidents    : ArrayList
    collided_at  : HashMap
end

rule "Setup statistics"
	salience 110
	no-loop true
when
   not( Statistics( ) )
   vehLoc : VehicleLocation()
then
   Statistics s = new Statistics();
   s.setSmashedcars (new ArrayList());
   s.setStopped_cars (new ArrayList());
   s.getStopped_cars().add(vehLoc);
   s.setCollided_at(new HashMap());
   insert( s );
   	System.out.println("Added");
end

rule "Add to stopped cars"
	salience 100
	no-loop true
when
	vehLoc : VehicleLocation()
	$stat  : Statistics ()
	((not( VehicleLocation(vid == vehLoc.vid) from $stat.getSmashedcars())))
then
	modify($stat) {
		getStopped_cars().add(vehLoc);
	}
	System.out.println("Not Found -- " + vehLoc.getVid() + "---" +
$stat.getStopped_cars().size());
end


rule "Identify Collided Vehicles"
	salience 90
	no-loop true
when
	vehLoc : VehicleLocation()
	$stat  : Statistics ()
	$allStoppedcars : ArrayList( size > 0 )
             from collect ( VehicleLocation(xway == vehLoc.xway, pos ==
vehLoc.pos, dir == vehLoc.dir, lane == vehLoc.lane) from $stat.stopped_cars)
then
	System.out.println("test" + "---" + $allStoppedcars.size() + "----" +
vehLoc.getVid());
	
	modify($stat) {
		setCollided_at(collided_at($allStoppedcars, vehLoc.getXway(),
vehLoc.getPos(), vehLoc.getDir(), vehLoc.getLane()));
	}
	retract (vehLoc);
end

rule "Detect Accident"
	salience 80
	no-loop true
when
	vehLoc : VehicleLocation()
	$stat  : Statistics ()
	eval(collision_occured($stat.getCollided_at()))
then
	System.out.println("Detect Accident");
end

function HashMap collided_at(ArrayList stopped_cars, int x, int pos, int
dir, int lane) {
    HashMap collided_at = new HashMap();
    for (Iterator iterator = stopped_cars.iterator(); iterator.hasNext(); )
{
        VehicleLocation vehLoc = (VehicleLocation) iterator.next();
        if (vehLoc.getXway() == x 
            && vehLoc.getPos() == pos 
            && vehLoc.getDir() == dir 
            && vehLoc.getLane() == lane) {
            
            int key = vehLoc.getVid();
            if (!collided_at.containsKey(key)) {
                collided_at.put (key, new Integer(1));
                continue;
            }
            collided_at.put (key,
((Integer)collided_at.get(key)).intValue()+1);
        }
    }
    return collided_at;
}

function boolean collision_occured(HashMap collided_vehicles) {
    java.util.Set entries = collided_vehicles.entrySet();
    int noOfCollidedVehicles = 0;
    java.util.Iterator iterator = entries.iterator();

    while ( iterator.hasNext() ) {
        java.util.Map.Entry object = (java.util.Map.Entry) iterator.next();
        if ((Integer)object.getValue() > 3) {
            noOfCollidedVehicles += 1;
        }
    }

    if (noOfCollidedVehicles > 0) {
        System.out.println("no of veh : "  + noOfCollidedVehicles);
    	return true;
    }
    return false;
}

Please let me know what should I correct here.
-- 
View this message in context: http://www.nabble.com/Using-eval-in-LHS-tp24646946p24646946.html
Sent from the drools - user mailing list archive at Nabble.com.




More information about the rules-users mailing list