[rules-users] Using eval in LHS

Greg Barton greg_barton at yahoo.com
Tue Jul 28 00:12:22 EDT 2009


See the attached project.  You can run it using maven with this command:

mvn package exec:java -Dexec.mainClass="com.sample.DroolsTest"

There are three basic rules: 

MakeCollision: Detect that a collision has happened

MatchCollision: Match vehicles to collisions

IdentifyLargeCollision: Find collisions that are "large"

rule "MakeCollision"
	salience 10
	when
		s : Sighting( collision == null )
		not Collision( direction == s.direction, position == s.position, lane == s.lane )
	then
		Collision c = new Collision( s.direction, s.position, s.lane );
		c.getSightings().add( s );
		s.setCollision( c );
		System.out.println("Creating " + c);
		update( s );
		insert( c );
end

rule "MatchCollision"
	salience 10
	when
		s : Sighting( collision == null )
		c : Collision( direction == s.direction, position == s.position, lane == s.lane )
	then
		c.getSightings().add( s );
		s.setCollision( c );
		System.out.println("Matching " + s);
		update( s );
		update( c );
end

rule "IdentifyLargeCollision"
	salience 5
	when
		num : Number ( intValue > 1 ) 
			from accumulate (
				Collision( sightings.size > 2 ),
				init( int count = 0; ),
				action( count++; ),
				reverse( count--; ),
				result( count )
			);	
	then
		System.out.println("Found " + num);
end

--- On Fri, 7/24/09, nash.8103 at gmail.com <nash.8103 at gmail.com> wrote:

> From: nash.8103 at gmail.com <nash.8103 at gmail.com>
> Subject: Re: [rules-users] Using eval in LHS
> To: "Rules Users List" <rules-users at lists.jboss.org>
> Date: Friday, July 24, 2009, 2:16 PM
> Thanks Greg.....
> 
> The reason I chose HashMap is that an accident is said to
> occur if and only if more than 1 vehicle contains  four
> consecutive position report as same. So in my hashmap key is
> vehicle id and value is the no. Of times same position
> report received... Can you suggest me a way to
> 1. Collect all vehicles stopped at some point and the
> occurance of that event  is reported more than thrice
> 2. Report accident if there are more than one vehicle found
> in step 1
>   
> ---Priya
> -original message-
> Subject: Re: [rules-users] Using eval in LHS
> From: Greg Barton <greg_barton at yahoo.com>
> Date: 24/07/2009 10:36 pm
> 
> 
> Try this:
> 
> rule "Create Collision Location"
>     salience 90
>     no-loop true
> when
>     vehLoc : VehicleLocation()
>     not CollisionLocation(xway == vehLoc.xway,
> pos ==
> vehLoc.pos, dir == vehLoc.dir, lane == vehLoc.lane)
> then
>     CollisionLocation collisionLoc = new
> CollisionLocation(vehLoc.getXway(),
> vehLoc.getPos(), vehLoc.getDir(), vehLoc.getLane());
>     insert(collisionLoc);
> end
> 
> rule "Collect Collided Vehicles"
>     salience 90
>     no-loop true
> when
>     vehLoc : VehicleLocation()
>     $collisionLoc : CollisionLocation(xway ==
> vehLoc.xway, pos ==
> vehLoc.pos, dir == vehLoc.dir, lane == vehLoc.lane)
> then
>    
> collisionLoc.getVehicleLocations().add(vehLoc);
>     update(collisionLoc);
> end
> 
> And now, the rule that detects more than three coinciding
> vehicle locations is simple:
> 
> rule "Detect Too Many"
> when
>     CollisionLocation(vehicleLocations.size >
> 2)
> then
>     ...foo...
> end
> 
> And, if you want to make the execution a bit more
> efficient, put a reference in VehicleLocation to it's
> associated CollisionLocation.  That way you can have
> "vehLoc : VehicleLocation(collisionLocation == null)" to
> reduce partial matches.
> 
> --- On Fri, 7/24/09, PriyaSha <nash.8103 at gmail.com>
> wrote:
> 
> > From: PriyaSha <nash.8103 at gmail.com>
> > Subject: [rules-users]  Using eval in LHS
> > To: rules-users at lists.jboss.org
> > Date: Friday, July 24, 2009, 10:45 AM
> > 
> > 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.
> > 
> > _______________________________________________
> > rules-users mailing list
> > rules-users at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
> > 
> 
> 
>       
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
> 
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>


      
-------------- next part --------------
A non-text attachment was scrubbed...
Name: collision.tar.gz
Type: application/x-gzip
Size: 6488 bytes
Desc: not available
Url : http://lists.jboss.org/pipermail/rules-users/attachments/20090727/53acacea/attachment.gz 


More information about the rules-users mailing list