Skip to content

Commit e0f02fe

Browse files
committed
Time made part of Universe
TestScenario now works.
1 parent d3e3b8f commit e0f02fe

18 files changed

+147
-72
lines changed

src/main/scala/example/TestScenario.scala

+67-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package example
22

3+
import org.apache.commons.math3.distribution.BinomialDistribution
34
import tcof._
4-
import tcof.traits.map2d.{Map2DTrait, Node}
5+
import tcof.traits.map2d.{Map2DTrait, Node, Position}
56
import tcof.traits.statespace.{StateSpaceTrait, interpolate}
67
import tcof.traits.statistics.StatisticsTrait
78

@@ -18,14 +19,13 @@ class TestScenario extends Universe with Map2DTrait[MapNodeStatus] with StateSpa
1819

1920
type MapNode = Node[MapNodeStatus]
2021

21-
var noOfStatusMsgReceived = 0
22-
var noOfStatusMsgToBeReceived = 1
23-
var time = 0
22+
var noOfStatusMsgReceived: Int = _
23+
var noOfStatusMsgToBeReceived: Int = _
2424

2525
def burnModel(node: MapNode) = interpolate.linear(
2626
0.0 -> 0.0,
2727
0.5 -> 0.1,
28-
1.0 -> 1.0
28+
1.0 -> 0.0
2929
)
3030

3131
abstract class MobileUnit extends Component {
@@ -51,20 +51,30 @@ class TestScenario extends Universe with Map2DTrait[MapNodeStatus] with StateSpa
5151
val routesToBuilding = map.shortestPath.to(building)
5252
val firePredictor = statespace(burnModel(building), 0, building.status.burnoutLevel)
5353

54+
/*
55+
println(s"FireFightingTeam for building $building")
56+
for (c <- components.collect{ case m: MobileUnit => m}) {
57+
val d = routesToBuilding.costFrom(c.mapPosition).get
58+
val f = firePredictor.valueAt(d)
59+
val s = msgDelivery(time - 3600, time).probability > 0.9 withConfidence 0.95
60+
println(s" ${c} - ${d} - ${f} - ${s}")
61+
}
62+
*/
63+
5464
membership(
5565
(msgDelivery(time - 3600, time).probability > 0.9 withConfidence 0.95) &&
5666

57-
allMembers.all(unit => routesToBuilding.costFrom(unit.mapPosition) match {
67+
fireBrigades.all(unit => routesToBuilding.costFrom(unit.mapPosition) match {
5868
case None => false
5969
case Some(travelTime) => firePredictor.valueAt(travelTime) < 0.9
6070
}) &&
6171

62-
fireBrigades.cardinality >= 1 && fireBrigades.cardinality <= 3 && ambulances.cardinality === 1
72+
fireBrigades.cardinality >= 1 && fireBrigades.cardinality <= 3 // && ambulances.cardinality === 1
6373
)
6474

6575
def travelTimeToUtility(routeTime: Option[Double]) = routeTime match {
6676
case None => 0
67-
case Some(time) => 100 - (time / 10000).round.toInt
77+
case Some(time) => 100 - time.toInt
6878
}
6979

7080
utility(
@@ -91,14 +101,62 @@ object TestScenario {
91101
val scenario = new TestScenario
92102
scenario.init()
93103

94-
scenario.components = List(
104+
val components = List(
95105
new scenario.FireBrigade(1),
96106
new scenario.FireBrigade(2),
97107
new scenario.FireBrigade(3),
98108
new scenario.AmbulanceTeam(1),
99109
new scenario.AmbulanceTeam(2)
100110
)
101111

112+
scenario.components = components
113+
114+
val mapNodes = new Array[Array[Node[MapNodeStatus]]](10)
115+
116+
for (x <- 0 until 10) {
117+
mapNodes(x) = new Array[Node[MapNodeStatus]](10)
118+
for (y <- 0 until 10) {
119+
val node = scenario.map.addNode(Position(x, y))
120+
node.status = new MapNodeStatus(MapNodeKind.Road, false, 0)
121+
mapNodes(x)(y) = node
122+
}
123+
}
124+
125+
for (x <- 1 until 10) {
126+
for (y <- 1 until 10) {
127+
scenario.map.addDirectedEdge(mapNodes(x)(y), mapNodes(x-1)(y), 1)
128+
scenario.map.addDirectedEdge(mapNodes(x)(y), mapNodes(x)(y-1), 1)
129+
scenario.map.addDirectedEdge(mapNodes(x-1)(y), mapNodes(x)(y), 1)
130+
scenario.map.addDirectedEdge(mapNodes(x)(y-1), mapNodes(x)(y), 1)
131+
}
132+
}
133+
134+
val componentMapPositions = List(
135+
mapNodes(2)(3),
136+
mapNodes(0)(8),
137+
mapNodes(1)(4),
138+
mapNodes(7)(6),
139+
mapNodes(9)(2)
140+
)
141+
142+
components.zip(componentMapPositions).foreach{
143+
case (component, position) => component.mapPosition = position
144+
}
145+
146+
mapNodes(7)(2).status = new MapNodeStatus(MapNodeKind.Building, true, 0.1)
147+
mapNodes(3)(4).status = new MapNodeStatus(MapNodeKind.Building, true, 0.7)
148+
149+
150+
val trials = 3
151+
val dist = new BinomialDistribution(trials, 0.91)
152+
153+
scenario.noOfStatusMsgToBeReceived = trials
154+
for (t <- 0 until 5000) {
155+
scenario.noOfStatusMsgReceived = dist.sample()
156+
scenario.step(t)
157+
}
158+
159+
102160
scenario.rootEnsemble.init()
103161
println("System initialized")
104162

src/main/scala/rcrs/FireBrigadeAgent.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import rescuecore2.standard.entities.{StandardEntityURN, FireBrigade => FireBrig
99
import rescuecore2.worldmodel.ChangeSet
1010

1111

12-
class FireBrigadeAgent extends ScalaAgent with Map2DTrait[RCRSNodeStatus] with RCRSMapAdapterTrait {
12+
class FireBrigadeAgent extends ScalaAgent {
1313
override type AgentEntityType = FireBrigadeEntity
1414

1515
val scenario = new RescueScenario
@@ -50,7 +50,7 @@ class FireBrigadeAgent extends ScalaAgent with Map2DTrait[RCRSNodeStatus] with R
5050
if (time >= ignoreAgentCommandsUntil) {
5151
// Logger.info("Heard: " + heard)
5252

53-
scenario.rcrsTraitStep(time: Int, changes: ChangeSet, heard: List[Command])
53+
scenario.rcrsStep(time: Int, changes: ChangeSet, heard: List[Command])
5454
scenario.components = List(component)
5555

5656
component.init()

src/main/scala/rcrs/ScalaAgent.scala

+1-6
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,15 @@ import scala.collection.mutable.ListBuffer
1414

1515

1616

17-
abstract class ScalaAgent extends RCRSTrait {
17+
abstract class ScalaAgent {
1818
sagent =>
1919

2020
type AgentEntityType <: StandardEntity
2121

22-
/* This is for making it possible to mix Traits with agents */
23-
val agent = this
24-
2522
protected def postConnect(): Unit = {
26-
init()
2723
}
2824

2925
protected def think(time: Int, changes: ChangeSet, heard: List[Command]): Unit = {
30-
rcrsTraitStep(time, changes, heard)
3126
}
3227

3328

src/main/scala/rcrs/scenario/AreaExplorationSupport.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package rcrs.scenario
33
import tcof.traits.map2d.{Map2D, Map2DTrait, Node, Position}
44
import rcrs.traits.RCRSConnectorTrait
55
import rcrs.traits.map2d.RCRSNodeStatus
6-
import rcrs.traits.time.CurrentTimeTrait
76
import rescuecore2.standard.entities.Human
7+
import tcof.Universe
88

99
trait AreaExplorationSupport {
10-
this: RCRSConnectorTrait with Map2DTrait[RCRSNodeStatus] with CurrentTimeTrait =>
10+
this: Universe with RCRSConnectorTrait with Map2DTrait[RCRSNodeStatus] =>
1111

1212
case class MapZone(xIdx: Int, yIdx: Int, maxLastVisitTime: Int) {
1313
override def toString: String = s"MapZone($xIdx, $yIdx)"

src/main/scala/rcrs/scenario/ObservationSupport.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import tcof.traits.map2d.{Map2DTrait, Node}
44
import rcrs.comm.{Constants, ExplorationStatus, Message}
55
import rcrs.traits.RCRSConnectorTrait
66
import rcrs.traits.map2d.{BuildingStatus, RCRSNodeStatus, RoadStatus}
7-
import rcrs.traits.time.CurrentTimeTrait
87
import rescuecore2.standard.entities.{Area, Building, Road}
8+
import tcof.Universe
99

1010
import scala.collection.JavaConverters._
1111
import scala.collection.mutable
1212

1313
trait ObservationSupport {
14-
this: RCRSConnectorTrait with Map2DTrait[RCRSNodeStatus] with CurrentTimeTrait =>
14+
this: Universe with RCRSConnectorTrait with Map2DTrait[RCRSNodeStatus] =>
1515

1616
/**
1717
* Observes and records changes in its close vicinity. It checks the "changes" variable, which contains what the agent has seen. Based on this, it upddates the map and sends the changes to the central station.

src/main/scala/rcrs/scenario/RegistrationSupport.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package rcrs.scenario
22

33
import rcrs.comm.{Constants, Message, RegRequest, RegResponse}
44
import rcrs.traits.RCRSConnectorTrait
5-
import rcrs.traits.time.CurrentTimeTrait
65
import rescuecore2.log.Logger
6+
import tcof.Universe
77

88
trait RegistrationSupport {
9-
this: RCRSConnectorTrait with CurrentTimeTrait =>
9+
this: Universe with RCRSConnectorTrait =>
1010

1111
/**
1212
* Obtains a shortId from the central server.

src/main/scala/rcrs/scenario/RescueScenario.scala

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@ import tcof._
44
import tcof.traits.map2d.{Map2DTrait, Position}
55
import rcrs.traits.RCRSConnectorTrait
66
import rcrs.traits.map2d.RCRSNodeStatus
7-
import rcrs.traits.time.CurrentTimeTrait
87

98

10-
class RescueScenario extends Universe with RCRSConnectorTrait with Map2DTrait[RCRSNodeStatus] with CurrentTimeTrait
9+
class RescueScenario extends Universe with RCRSConnectorTrait with Map2DTrait[RCRSNodeStatus]
1110
with MobileUnitComponent with RegistrationSupport with AreaExplorationSupport with ObservationSupport {
1211

1312
class PoliceForce(no: Int, _position: Position) extends MobileUnit(_position) {

src/main/scala/rcrs/traits/RCRSConnectorTrait.scala

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ import rescuecore2.messages.Command
88
import rescuecore2.standard.entities.StandardEntity
99
import rescuecore2.standard.messages.AKSpeak
1010
import rescuecore2.worldmodel.ChangeSet
11+
import tcof.Universe
1112

1213
trait RCRSConnectorTrait extends RCRSTrait with RCRSMapAdapterTrait {
13-
this: Map2DTrait[RCRSNodeStatus] =>
14+
this: Universe with Map2DTrait[RCRSNodeStatus] =>
1415

1516
var agent: ScalaAgent = _
1617

@@ -23,11 +24,11 @@ trait RCRSConnectorTrait extends RCRSTrait with RCRSMapAdapterTrait {
2324
def messages = heard.collect{ case speak : AKSpeak => Message.decode(speak.getContent) }
2425
}
2526

26-
override def rcrsTraitStep(time: Int, changes: ChangeSet, heard: List[Command]): Unit = {
27+
def rcrsStep(time: Int, changes: ChangeSet, heard: List[Command]): Unit = {
2728
sensing.changes = changes
2829
sensing.heard = heard
2930

30-
super.rcrsTraitStep(time, changes, heard)
31+
step(time)
3132
}
3233

3334
}

src/main/scala/rcrs/traits/RCRSTrait.scala

-4
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,4 @@ import rescuecore2.worldmodel.ChangeSet
77

88
trait RCRSTrait extends Trait {
99
def agent: ScalaAgent
10-
11-
def rcrsTraitStep(time: Int, changes: ChangeSet, heard: List[Command]): Unit = {
12-
}
13-
1410
}

src/main/scala/rcrs/traits/time/CurrentTimeTrait.scala

-17
This file was deleted.

src/main/scala/tcof/CommonImplicits.scala

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ trait CommonImplicits {
44
this: WithConfig =>
55

66
implicit class WithMembersIterable[MemberType](memberGroups: Iterable[WithMembers[MemberType]]) {
7-
def allDisjoint: Logical = LogicalBoolVar(_solverModel.allDisjoint(memberGroups.map(_.allMembersVar).toArray : _*).reify())
7+
def allDisjoint: Logical =
8+
if (memberGroups.isEmpty)
9+
LogicalBoolean(true)
10+
else
11+
LogicalBoolVar(_solverModel.allDisjoint(memberGroups.map(_.allMembersVar).toArray : _*).reify())
812
}
913

1014
implicit def booleanToLogical(x: Boolean): LogicalBoolean = LogicalBoolean(x)

src/main/scala/tcof/SolverModel.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class SolverModel extends Model {
111111
}
112112
}
113113

114-
def sumBasedOnMembership(membersVar: SetVar, values: Iterable[Integer]): IntegerIntVar = {
114+
def sumBasedOnMembership(membersVar: SetVar, values: Iterable[Integer]): Integer = {
115115
IntegerIntVar(
116116
if (values.forall(_.isInstanceOf[IntegerInt]))
117117
sumIntsBasedOnMembership(membersVar, values)

src/main/scala/tcof/Universe.scala

+10
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
package tcof
22

3+
import rescuecore2.messages.Command
4+
import rescuecore2.worldmodel.ChangeSet
35
import tcof.traits.Trait
46

57
abstract class Universe extends Trait {
8+
private var _time = 0
9+
def time = _time
10+
11+
def step(time: Int): Unit = {
12+
_time = time
13+
traitStep()
14+
}
15+
616
private var _universe = Seq.empty[Component]
717
def components_= (univ: Seq[Component]): Unit = _universe = univ
818
def components: Seq[Component] = _universe

src/main/scala/tcof/WithMembers.scala

+1-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ trait WithMembers[+MemberType] extends WithConfig with Initializable {
1313
super._init(stage, config)
1414

1515
stage match {
16-
case InitStages.VarsCreation =>
17-
allMembersVar = _solverModel.setVar(Array.empty[Int], 0 until allMembers.size toArray)
16+
case InitStages.VarsCreation => allMembersVar = _solverModel.setVar(Array.empty[Int], 0 until allMembers.size toArray)
1817
case _ =>
1918
}
2019
}
+7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package tcof.traits
22

3+
import rescuecore2.messages.Command
4+
import rescuecore2.worldmodel.ChangeSet
5+
36
trait Trait {
47
def init(): Unit = {
58
}
9+
10+
protected def traitStep(): Unit = {
11+
}
12+
613
}

src/main/scala/tcof/traits/map2d/Node.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ class Node[NodeStatusType] private[map2d](val map: Map2D[NodeStatusType], val ce
1111

1212
var status: NodeStatusType = _
1313

14-
override def toString() = s"Node(${lastVisitTime})"
14+
override def toString() = s"Node(${center.x}, ${center.y})"
1515
}

0 commit comments

Comments
 (0)