diff --git a/doc/report/figures/fsm/mgm2_supervisor.gv b/doc/report/figures/fsm/mgm2_supervisor.gv
index 001bf11cd6f5609d7d5b34af06bad13a3bc4065e..46ab71bc7cf93e5be5af62ff1e088c68210f94e0 100644
--- a/doc/report/figures/fsm/mgm2_supervisor.gv
+++ b/doc/report/figures/fsm/mgm2_supervisor.gv
@@ -7,18 +7,18 @@ digraph finite_state_machine {
node [shape = circle];
/*THE SUPERVISOR*/
- start -> WaitingForAgentValues [label = " broadcast(agents) ! Trigger
+ Start -> RunningSupervisorState [label = " broadcast(agents) ! Trigger
"];
- WaitingForAgentValues -> WaitingForAgentValues [label = " agent : KickStartMe =>
+ RunningSupervisorState -> RunningSupervisorState [label = " agent : KickStartMe =>
agent ! ContinueAlgo
"];
- WaitingForAgentValues -> WaitingForAgentValues [label = " agent : InformValue(val) && (#currentContext < #agents - 1) =>
+ RunningSupervisorState -> RunningSupervisorState [label = " agent : InformValue(val) && (#currentContext < #agents - 1) =>
currentContext.put(agent, val)
"];
- WaitingForAgentValues -> DecidingToContinueOrStop [label = " agent : InformValue(val) && (#currentContext == #agents - 1) =>
+ RunningSupervisorState -> Deciding [label = " agent : InformValue(val) && (#currentContext == #agents - 1) =>
currentContext.put(agent, val)
self.shouldAlgoKeepOn() match {
case true => broadcast ! ContinueAlgo
@@ -29,16 +29,16 @@ digraph finite_state_machine {
"];
- DecidingToContinueOrStop -> WaitingForAgentValues [label = " self ! ContinueAlgo =>
+ Deciding -> RunningSupervisorState [label = " self ! ContinueAlgo =>
currentContext.reset();
unstashall
"];
- DecidingToContinueOrStop -> DecidingToContinueOrStop [label = " sender : InformValue(val) =>
+ Deciding -> Deciding [label = " sender : InformValue(val) =>
stash
"];
- DecidingToContinueOrStop -> Finish [label = " self ! StopAlgo =>
+ Deciding -> Finish [label = " self ! StopAlgo =>
return currentContext
"];
}
\ No newline at end of file
diff --git a/doc/report/figures/fsm/mgm2_supervisor.png b/doc/report/figures/fsm/mgm2_supervisor.png
index 76a2276dbca5374bb12ebfb76162f63b232291a7..e1c5cb2457c1e30ded11ef31e8d8c7b1f0ac9353 100644
Binary files a/doc/report/figures/fsm/mgm2_supervisor.png and b/doc/report/figures/fsm/mgm2_supervisor.png differ
diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/AgentBehaviour.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/AgentBehaviour.scala
index ccfc53f9a084f0216f5decbbcfcb491efa6dbbae..ead4194ae85c2504dd91c6f0f766df48e36d0871 100644
--- a/src/main/scala/org/scadcop/solver/decentralized/mgm2/AgentBehaviour.scala
+++ b/src/main/scala/org/scadcop/solver/decentralized/mgm2/AgentBehaviour.scala
@@ -407,21 +407,21 @@ class AgentBehaviour(variable: Variable,
val newVal: Value = mind.updateVal(variable, move)
val updatedMind: MGM2Mind = mind.updateContext(variable, variable, newVal)
if (trace) println(s"$variable -> Supervisor : I changed = InformValue(${updatedMind.context.getValue(variable).get})")
- //supervisor ! InformValue(updatedMind.context.getValue(variable).get)
+ supervisor ! InformValue(updatedMind.context.getValue(variable).get)
goto(Continue) using updatedMind
// When it should act because it has the highest delta in the neighbourhood
case Event(Act(true, None), mind) =>
if (debug) println(s"$variable in $stateName has received Act(true) but has no move")
- if (trace) println(s"$variable -> $supervisor : I kept my previous value = InformValue(${mind.context.getValue(variable).get})")
- //supervisor ! InformValue(updatedMind.context.getValue(variable).get)
+ if (trace) println(s"$variable -> Supervisor : I kept my previous value = InformValue(${mind.context.getValue(variable).get})")
+ supervisor ! InformValue(updatedMind.context.getValue(variable).get)
goto(Continue) using mind
// When it should not act because it does not have the highest delta in the neighbourhood
case Event(Act(false, _), mind) =>
if (debug) println(s"$variable in $stateName has received Act(false)")
if (trace) println(s"$variable -> Supervisor : I didn't change = InformValue(${mind.context.getValue(variable).get})")
- //supervisor ! InformValue(mind.context.getValue(variable).get)
+ supervisor ! InformValue(mind.context.getValue(variable).get)
goto(Continue) using mind
}
diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala
index 63d7907320781ebbb83966674d52d1311158d651..17f7cc07ad1e21fd1bcbcbfb39cd251743f92393 100644
--- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala
+++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala
@@ -102,6 +102,7 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm) extends Actor with Sta
* Handles the message in the running state
*/
when(RunningSupervisorState) {
+
// When an agent wants to start
case Event(KickStartMe, status) =>
sender ! ContinueAlgo
@@ -147,6 +148,32 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm) extends Actor with Sta
}
}
+
+ /**
+ * Handles the messages when the supervisor is branching either to do anothe round or to stop.
+ */
+ when(Deciding) {
+
+ //when an agent informs the supervisor of its current value
+ case Event(InformValue(v), status) => {
+ stash
+ stay using status
+ }
+
+ //when it receives its own decison that it should continue
+ case Event(ContinueAlgo, status) => {
+ //TODO reset the context it has
+ unstashall
+ goto(RunningSupervisorState) using status
+ }
+
+ case Event(StopAlgo, status) => {
+ //TODO ???
+ }
+
+ }
+
+
/**
* Handles the message in the final state
*/
diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorState.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorState.scala
index a9b463f978d2785b7220e18c95a8e9c0f6bd2091..2cb0fd0e9d6cb422e5f0925991d55949331f4b41 100644
--- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorState.scala
+++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorState.scala
@@ -10,4 +10,5 @@ trait SupervisorState extends State
case object InitialSupervisorState extends SupervisorState
case object RunningSupervisorState extends SupervisorState
case object FinalSupervisorState extends SupervisorState
+case object Deciding extends SupervisorState