[rules-users] Using eval in LHS

Greg Barton greg_barton at yahoo.com
Fri Jul 24 13:04:17 EDT 2009


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
> 


      




More information about the rules-users mailing list