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(a)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(a)gmail.com> wrote:
From: PriyaSha <nash.8103(a)gmail.com>
Subject: [rules-users] Using eval in LHS
To: rules-users(a)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(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org