Skip to content
Snippets Groups Projects
Commit 285f5c79 authored by Jean-Christophe Routier's avatar Jean-Christophe Routier
Browse files

Merge branch 'master' of gitlab-ssh.univ-lille.fr:maxime.morge/scadcop

parents f3fa8e1d e80bd43e
Branches
No related tags found
No related merge requests found
......@@ -85,6 +85,12 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co
new SupervisorStatus(readyVariables = status.readyVariables + variable,
isFirstRound = status.isFirstRound)
//when it receives an InformValue from an early agent
case Event(InformValue(_), status) => {
stash
stay using status
}
//When all the agents become ready
case Event(Ready, status) if status.nbReady == pb.size - 1 =>
val variable = directory.variableOf(sender)
......@@ -93,6 +99,7 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co
if (trace) println(s"Supervisor -> $anyVariable : Trigger")
directory.addressOf(anyVariable) ! Trigger
}
unstashAll
goto(RunningSupervisorState) using
new SupervisorStatus(readyVariables = status.readyVariables + variable,
isFirstRound = status.isFirstRound)
......@@ -109,22 +116,25 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co
stay using status
// When an agent becomes inactive
case Event(InformValue(value), status) if status.assignment.valuation.size < pb.size - 1 =>
case Event(InformValue(value), status) if status.informValCounter < pb.size - 1 =>
val variable: Variable = directory.variableOf(sender)
if (debug) println(s"Supervisor ($stateName): $variable is inactive")
stay using new SupervisorStatus(readyVariables = status.readyVariables,
var updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables,
inactiveVariables = status.inactiveVariables + variable,
assignment = status.assignment.fix(variable,value),
isFirstRound = status.isFirstRound)
updatedStatus.incrementInformValCounter()
stay using updatedStatus
// When all the agent become inactive
case Event(InformValue(value), status) if status.assignment.valuation.size == pb.size - 1 =>
case Event(InformValue(value), status) if status.informValCounter == pb.size - 1 =>
val variable: Variable = directory.variableOf(sender)
if (debug) println(s"Supervisor ($stateName): $variable is finally inactive")
val updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables,
var updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables,
inactiveVariables = status.inactiveVariables + variable,
assignment = status.assignment.fix(variable,value),
isFirstRound = false)
updatedStatus.incrementInformValCounter()
if (! updatedStatus.isTerminated){// If the solving must be restart for another round
pb.variables.foreach { anyVariable: Variable =>
......
......@@ -18,7 +18,8 @@ class SupervisorStatus(val readyVariables: Set[Variable] = Set(),
val killedVariables: Set[Variable] = Set(),
val assignment: Context = new Context(),
val metric: Metric= collection.mutable.Map[String,Double](),
val isFirstRound : Boolean = true
val isFirstRound : Boolean = true,
val informValCounter: Int = 0
){
/**
......@@ -42,14 +43,26 @@ class SupervisorStatus(val readyVariables: Set[Variable] = Set(),
*/
def isTerminated : Boolean = Supervisor.incrementCounter() > Supervisor.NB_ROUNDS
def incrementInformValCounter(): SupervisorStatus = {
new SupervisorStatus(readyVariables,
inactiveVariables,
killedVariables,
assignment,
metric,
isFirstRound,
informValCounter = informValCounter + 1
)
}
/*Returns the updated supervisor's status when resetting the context*/
def resetContext(): SupervisorStatus = {
new SupervisorStatus(readyVariables,
inactiveVariables = Set(),
killedVariables,
assignment = new Context(),
assignment,
metric,
isFirstRound
isFirstRound,
informValCounter = 0
)
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment