Skip to content
Snippets Groups Projects
Commit 0403b5b1 authored by Alex's avatar Alex
Browse files

added figures to report but not compiling... failed to fix bug for now

parent dc25a873
Branches
No related tags found
No related merge requests found
Showing
with 867 additions and 3 deletions
digraph finite_state_machine {
rankdir=TB;
ratio="fill";
margin=0.1;
node [shape = doublecircle]; Final;
node [shape = circle];
/*THE END ?*/
Continue -> Final [ label = "Supervisor : StopAlgo =>
Nothing
"];
Continue -> Continue [ label = "neighbour : InformValue(v) =>
stash
"];
Continue -> WaitingRoleAssignment [label = "Supervisor : ContinueAlgo =>
self.reset(self.var)
broadcast ! InformValue(self.var.val)
subset = self.determineSubset(threshold)
self ! determineSubset(threshold)
unstashall
"];
/*THE BEGINING*/
init -> Continue [ label = "Supervisor : Trigger =>
unstashall
Supervisor ! KickStartMe
"];
init -> init [ label = "neighbour : InformValue(v) =>
stash
"];
WaitingRoleAssignment -> WaitingRoleAssignment [label = "neighbour : InformValue(v) =>
stash
"];
WaitingRoleAssignment -> OffererWaitingValues [ label = "self : DetermineSubset(true) =>
unstashall
"];
WaitingRoleAssignment -> ReceiverWaitingValues [ label = "self : DetermineSubset(false) =>
unstashall
"];
/*No matter what my partner says, when I'm here, I don't care, I won't act*/
Continue -> Continue [label = "self.partner : GiveGo =>
Nothing
"];
Continue -> Continue [label = "self.partner : GiveNogo =>
Nothing
"];
/*End*/
/*What an uncommitted agent does*/
ActSolo -> Continue [label = "self : Act(false, move) =>
Supervisor ! InformValue(self.val)
"];
ActSolo -> Continue [label = "self : Act(true, move) =>
newVal = computeNewVal(retainedMove)
self.val = newVal
Supervisor ! InformValue(self.val)
"];
/*I can act but my partner can't... drop it all*/
HandlingPartnersGoNogo -> Continue [label = "self.partner : GiveNogo =>
Supervisor ! InformValue(self.val)
"];
/*I can act and my partner can: let's go!*/
HandlingPartnersGoNogo -> Continue [label = "self.partner : GiveGo(someMove) =>
newVal = computeNewVal(someMove)
self.val = newVal
Supervisor ! InformValue(newVal)
"];
}
\ No newline at end of file
doc/report/figures/fsm/agent_beginning.png

191 KiB

digraph finite_state_machine {
rankdir=TB;
ratio="fill";
margin=0.1;
node [shape = doublecircle]; Final;
node [shape = circle];
/*THE END ?*/
Continue -> Final [ label = "Supervisor : StopAlgo =>
Nothing
"];
Continue -> Continue [ label = "neighbour : InformValue(v) =>
stash
"];
Continue -> WaitingRoleAssignment [label = "Supervisor : ContinueAlgo =>
self.reset(self.var)
broadcast ! InformValue(self.var.val)
subset = self.determineSubset(threshold)
self ! determineSubset(threshold)
unstashall
"];
/*THE BEGINING*/
init -> Continue [ label = "Supervisor : Trigger =>
unstashall
Supervisor ! KickStartMe
"];
/*THE OFFERER*/
OffererMakingOffer -> Committed [label = "newPartner : Accept(someOffer) =>
unstashall
self.fullyCommit(self.var, newPartner, )
self.partner = newPartner
self.committed = true
self.neighbourDeltas.put(self, someOffer.delta)
self.currBestOffer = someOffer
broadcast ! InformDelta(self.myDelta)
"];
/*THE RECEIVER*/
/*RECEIVER ALL OFFERS RECEIVED*/
/*There is a viable offer*/
ReceiverAllOffersReceived -> Committed [label = "self : BestOffer(theOffer, theDelta) =>
unstashall
self.partner = theOffer.sender
self.committed = true
self.partner ! Accept(theOffer)
myDelta = theDelta
self.neighbourDeltas.put(self, myDelta)
self.rejectAllUselessOffers(receivedOffers, self.partner)
broadcast ! InformDelta(self.myDelta)
"];
/*THE END?*/
/*committed*/
Committed -> Committed [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas < #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
"];
/*committed*/
Committed -> GivingPartnerGoNoGo [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas == #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
shouldAct = self.amIBest(self)
self ! Act(shouldAct, self.currBestOffer.move)
"];
GivingPartnerGoNoGo -> GivingPartnerGoNoGo [label = "self.partner : GiveGo =>
stash
"];
GivingPartnerGoNoGo -> GivingPartnerGoNoGo [label = "self.partner : GiveNogo =>
stash
"];
GivingPartnerGoNoGo -> Continue [label = "self : Act(false, move) =>
unstashall
self.partner ! GiveNogo
Supervisor ! InformValue(self.val)
"];
/*No matter what my partner says, when I'm here, I don't care, I won't act*/
Continue -> Continue [label = "self.partner : GiveGo =>
Nothing
"];
Continue -> Continue [label = "self.partner : GiveNogo =>
Nothing
"];
/*I can act, I'm telling my partner it should too*/
GivingPartnerGoNoGo -> HandlingPartnersGoNogo [label = "self : Act(true, move) =>
unstashall
self.partner ! GiveGo(move)
"];
/*I can act but my partner can't... drop it all*/
HandlingPartnersGoNogo -> Continue [label = "self.partner : GiveNogo =>
Supervisor ! InformValue(self.val)
"];
/*I can act and my partner can: let's go!*/
HandlingPartnersGoNogo -> Continue [label = "self.partner : GiveGo(someMove) =>
newVal = computeNewVal(someMove)
self.val = newVal
Supervisor ! InformValue(newVal)
"];
}
\ No newline at end of file
doc/report/figures/fsm/committed.png

281 KiB

digraph finite_state_machine {
rankdir=TB;
ratio="fill";
margin=0.1;
node [shape = doublecircle]; Final;
node [shape = circle];
/*THE END ?*/
Continue -> Final [ label = "Supervisor : StopAlgo =>
Nothing
"];
Continue -> Continue [ label = "neighbour : InformValue(v) =>
stash
"];
Continue -> WaitingRoleAssignment [label = "Supervisor : ContinueAlgo =>
self.reset(self.var)
broadcast ! InformValue(self.var.val)
subset = self.determineSubset(threshold)
self ! determineSubset(threshold)
unstashall
"];
/*THE BEGINING*/
init -> Continue [ label = "Supervisor : Trigger =>
unstashall
Supervisor ! KickStartMe
"];
init -> init [ label = "neighbour : InformValue(v) =>
stash
"];
WaitingRoleAssignment -> WaitingRoleAssignment [label = "neighbour : InformValue(v) =>
stash
"];
WaitingRoleAssignment -> OffererWaitingValues [ label = "self : DetermineSubset(true) =>
unstashall
"];
WaitingRoleAssignment -> ReceiverWaitingValues [ label = "self : DetermineSubset(false) =>
unstashall
"];
/*THE OFFERER*/
OffererWaitingValues -> OffererWaitingValues [label = "neighbour : InformValue(v) && (#self.neighbourValues < #neighbours-1) =>
self.neighbourValues.put(neighbour, v)
"];
OffererWaitingValues -> OffererWaitingValues [label = "neighbour : MakeOffer(someOffer) =>
neighbour ! RejectOffer(someOffer)
"];
OffererWaitingValues -> OffererMakingOffer [label = "neighbour : InformValue(v) && (#self.neighbourValues == #neighbours-1) =>
self.updateNeighboursValue(self.var, v.sender, v)
potentialPartner = choosePartner(neighbours)
myOffer = self.computeJointOffer(variable, neighbours, constraints)
potentialPartner ! MakeOffer(myOffer)
multicast(neighbour-potentialPartner) ! MakeOffer(None)
"];
/*Receives a new offer*/
OffererMakingOffer -> OffererMakingOffer [label = "neighbour : MakeOffer(someOffer)=>
neighbour ! RejectOffer(someOffer)"];
/*Receives a delta*/
OffererMakingOffer -> OffererMakingOffer [label = "neighbour : InformDelta(delta) =>
stash
"];
OffererMakingOffer -> Committed [label = "newPartner : Accept(someOffer) =>
unstashall
self.fullyCommit(self.var, newPartner, )
self.partner = newPartner
self.committed = true
self.neighbourDeltas.put(self, someOffer.delta)
self.currBestOffer = someOffer
broadcast ! InformDelta(self.myDelta)
"];
OffererMakingOffer -> Uncommitted [label = "potentialPartner : RejectOffer(offer) =>
unstashall
self.committed = false
myDelta = bestUnilateralMove(variable, constraints)
self.neighbourDeltas.put(self, myDelta)
broadcast ! InformDelta(self.myDelta)
"];
/*THE RECEIVER*/
/*RECEIVER WAITING VALUES*/
/*Not all values*/
ReceiverWaitingValues -> ReceiverWaitingValues [label = "neighbour : InformValue(val) && (#self.neighbourValues < #neighbours-1) =>
self.neighbourValues.put(neighbour, val)
"];
/*all values*/
ReceiverWaitingValues -> ReceiverWaitingOffers [label = "neighbour : InformValue(val) && (#self.neighbourValues == #neighbours-1) =>
self.neighbourValues.put(neighbour, val)
unstashall
"];
ReceiverWaitingValues -> ReceiverWaitingValues [label = "neighbour : MakeOffer(someOffer/None) =>
stash
"];
/*Receives a neighbour's delta*/
ReceiverWaitingOffers -> ReceiverWaitingOffers [label = "neighbour : InformDelta(delta) =>
stash
"];
/*RECEIVER WAITING OFFERS*/
/*Receives a new valid offer*/
ReceiverWaitingOffers -> ReceiverWaitingOffers [label = "neighbour : MakeOffer(offer) && (#totalNbself.receivedOffers < #neighbours-1) =>
totalNbself.receivedOffers ++
self.receivedOffers.put(offer)
"];
/*Receives a new blank offer*/
ReceiverWaitingOffers -> ReceiverWaitingOffers [label = "neighbour : MakeOffer(None) && (#totalNbself.receivedOffers < #neighbours-1) =>
totalNbself.receivedOffers ++
"];
/*Receives last offer and it's a valid one*/
ReceiverWaitingOffers -> ReceiverAllOffersReceived [label = "neighbour : MakeOffer(offer) && (#totalNbself.receivedOffers == #neighbours-1) && (#self.neighbourValues == #neighbours-1) =>
self.receivedOffers.put(offer)
(chosenOffer, delta) = chooseBestSingleOffer(variable, neighbours, constraints)
self ! BestOffer(chosenOffer, delta)
"];
/*Receives last offer and its a blank one*/
ReceiverWaitingOffers -> ReceiverAllOffersReceived [label = "neighbour : MakeOffer(None) && (#totalNbself.receivedOffers == #neighbours-1) && (#self.neighbourValues == #neighbours-1) =>
(chosenOffer, delta) = chooseBestSingleOffer(variable, neighbours, constraints)
self ! BestOffer(chosenOffer, delta)
"];
/*RECEIVER ALL OFFERS RECEIVED*/
/*Receives a neighbour's delta*/
ReceiverAllOffersReceived -> ReceiverAllOffersReceived [label = "neighbour : InformDelta(delta) =>
stash
"];
/*Receive a void offer from itself: there are no viable offers*/
ReceiverAllOffersReceived -> Uncommitted [label = "self : BestOffer(None, _) =>
unstashall
self.rejectAllUselessOffers(receivedOffers, None)
self.committed = false
self.myDelta = bestUnilateralMove(variable, constraints)
broadcast ! InformDelta(self.myDelta)
"];
/*There is a viable offer*/
ReceiverAllOffersReceived -> Committed [label = "self : BestOffer(theOffer, theDelta) =>
unstashall
self.partner = theOffer.sender
self.committed = true
self.partner ! Accept(theOffer)
myDelta = theDelta
self.neighbourDeltas.put(self, myDelta)
self.rejectAllUselessOffers(receivedOffers, self.partner)
broadcast ! InformDelta(self.myDelta)
"];
/*THE END?*/
/*committed*/
Committed -> Committed [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas < #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
"];
/*committed*/
Committed -> GivingPartnerGoNoGo [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas == #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
shouldAct = self.amIBest(self)
self ! Act(shouldAct, self.currBestOffer.move)
"];
/*uncommitted*/
Uncommitted -> Uncommitted [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas < #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
"];
/*uncommitted*/
Uncommitted -> ActSolo [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas == #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
amIBest = self.amIBest(self)
self ! Act(shouldAct, move)
"];
/*What an uncommitted agent does*/
ActSolo -> Continue [label = "self : Act(false, move) =>
Supervisor ! InformValue(self.val)
"];
ActSolo -> Continue [label = "self : Act(true, move) =>
newVal = computeNewVal(retainedMove)
self.val = newVal
Supervisor ! InformValue(self.val)
"];
GivingPartnerGoNoGo -> GivingPartnerGoNoGo [label = "self.partner : GiveGo =>
stash
"];
GivingPartnerGoNoGo -> GivingPartnerGoNoGo [label = "self.partner : GiveNogo =>
stash
"];
GivingPartnerGoNoGo -> Continue [label = "self : Act(false, move) =>
unstashall
self.partner ! GiveNogo
Supervisor ! InformValue(self.val)
"];
/*No matter what my partner says, when I'm here, I don't care, I won't act*/
Continue -> Continue [label = "self.partner : GiveGo =>
Nothing
"];
Continue -> Continue [label = "self.partner : GiveNogo =>
Nothing
"];
/*I can act, I'm telling my partner it should too*/
GivingPartnerGoNoGo -> HandlingPartnersGoNogo [label = "self : Act(true, move) =>
unstashall
self.partner ! GiveGo(move)
"];
/*I can act but my partner can't... drop it all*/
HandlingPartnersGoNogo -> Continue [label = "self.partner : GiveNogo =>
Supervisor ! InformValue(self.val)
"];
/*I can act and my partner can: let's go!*/
HandlingPartnersGoNogo -> Continue [label = "self.partner : GiveGo(someMove) =>
newVal = computeNewVal(someMove)
self.val = newVal
Supervisor ! InformValue(newVal)
"];
}
\ No newline at end of file
doc/report/figures/fsm/full_mgm2_agent.png

738 KiB

#!/bin/bash
for f in *.gv;
do
dot -Tpng $f -o ${f%.gv}.png
echo "Processing $f file...";
done
digraph finite_state_machine {
rankdir=TB;
ratio="fill";
margin=0.1;
node [shape = doublecircle]; Finish;
node [shape = circle];
/*THE SUPERVISOR*/
start -> WaitingForAgentValues [label = " broadcast(agents) ! Trigger
"];
WaitingForAgentValues -> WaitingForAgentValues [label = " agent : KickStartMe =>
agent ! ContinueAlgo
"];
WaitingForAgentValues -> WaitingForAgentValues [label = " agent : InformValue(val) && (#currentContext < #agents - 1) =>
currentContext.put(agent, val)
"];
WaitingForAgentValues -> DecidingToContinueOrStop [label = " agent : InformValue(val) && (#currentContext == #agents - 1) =>
currentContext.put(agent, val)
self.shouldAlgoKeepOn() match {
case true => broadcast ! ContinueAlgo
self ! ContinueAlgo
case false => broadcast ! StopAlgo
self ! StopAlgo
}
"];
DecidingToContinueOrStop -> WaitingForAgentValues [label = " self ! ContinueAlgo =>
currentContext.reset();
unstashall
"];
DecidingToContinueOrStop -> DecidingToContinueOrStop [label = " sender : InformValue(val) =>
stash
"];
DecidingToContinueOrStop -> Finish [label = " self ! StopAlgo =>
return currentContext
"];
}
\ No newline at end of file
doc/report/figures/fsm/mgm2_supervisor.png

121 KiB

digraph finite_state_machine {
rankdir=TB;
ratio="fill";
margin=0.1;
node [shape = circle];
/*THE BEGINING*/
WaitingRoleAssignment -> WaitingRoleAssignment [label = "neighbour : InformValue(v) =>
stash
"];
WaitingRoleAssignment -> OffererWaitingValues [ label = "self : DetermineSubset(true) =>
unstashall
"];
/*THE OFFERER*/
OffererWaitingValues -> OffererWaitingValues [label = "neighbour : InformValue(v) && (#self.neighbourValues < #neighbours-1) =>
self.neighbourValues.put(neighbour, v)
"];
OffererWaitingValues -> OffererWaitingValues [label = "neighbour : MakeOffer(someOffer) =>
neighbour ! RejectOffer(someOffer)
"];
OffererWaitingValues -> OffererMakingOffer [label = "neighbour : InformValue(v) && (#self.neighbourValues == #neighbours-1) =>
self.updateNeighboursValue(self.var, v.sender, v)
potentialPartner = choosePartner(neighbours)
myOffer = self.computeJointOffer(variable, neighbours, constraints)
potentialPartner ! MakeOffer(myOffer)
multicast(neighbour-potentialPartner) ! MakeOffer(None)
"];
/*Receives a new offer*/
OffererMakingOffer -> OffererMakingOffer [label = "neighbour : MakeOffer(someOffer)=>
neighbour ! RejectOffer(someOffer)"];
/*Receives a delta*/
OffererMakingOffer -> OffererMakingOffer [label = "neighbour : InformDelta(delta) =>
stash
"];
OffererMakingOffer -> Committed [label = "potentialPartner : Accept(someOffer) =>
unstashall
self.fullyCommit(self.var, newPartner, )
self.partner = newPartner
self.committed = true
self.neighbourDeltas.put(self, someOffer.delta)
self.currBestOffer = someOffer
broadcast ! InformDelta(self.myDelta)
"];
OffererMakingOffer -> Uncommitted [label = "potentialPartner : RejectOffer(offer) =>
unstashall
self.committed = false
myDelta = bestUnilateralMove(variable, constraints)
self.neighbourDeltas.put(self, myDelta)
broadcast ! InformDelta(self.myDelta)
"];
OffererMakingOffer -> OffererMakingOffer [label = "someNeighbour : RejectOffer(offer) =>
Nothing
"];
/*THE END?*/
/*committed*/
Committed -> Committed [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas < #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
"];
/*uncommitted*/
Uncommitted -> Uncommitted [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas < #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
"];
}
\ No newline at end of file
doc/report/figures/fsm/offerer.png

197 KiB

digraph finite_state_machine {
rankdir=TB;
ratio="fill";
margin=0.1;
node [shape = circle];
WaitingRoleAssignment -> WaitingRoleAssignment [label = "neighbour : InformValue(v) =>
stash
"];
WaitingRoleAssignment -> ReceiverWaitingValues [ label = "self : DetermineSubset(false) =>
unstashall
"];
/*THE RECEIVER*/
/*RECEIVER WAITING VALUES*/
/*Not all values*/
ReceiverWaitingValues -> ReceiverWaitingValues [label = "neighbour : InformValue(val) && (#self.neighbourValues < #neighbours-1) =>
self.neighbourValues.put(neighbour, val)
"];
/*all values*/
ReceiverWaitingValues -> ReceiverWaitingOffers [label = "neighbour : InformValue(val) && (#self.neighbourValues == #neighbours-1) =>
self.neighbourValues.put(neighbour, val)
unstashall
"];
ReceiverWaitingValues -> ReceiverWaitingValues [label = "neighbour : MakeOffer(someOffer/None) =>
stash
"];
/*RECEIVER WAITING OFFERS*/
/*Receives a new valid offer*/
ReceiverWaitingOffers -> ReceiverWaitingOffers [label = "neighbour : MakeOffer(offer) && (#totalNbself.receivedOffers < #neighbours-1) =>
totalNbself.receivedOffers ++
self.receivedOffers.put(offer)
"];
/*Receives a new blank offer*/
ReceiverWaitingOffers -> ReceiverWaitingOffers [label = "neighbour : MakeOffer(None) && (#totalNbself.receivedOffers < #neighbours-1) =>
totalNbself.receivedOffers ++
"];
/*Receives last offer and it's a valid one*/
ReceiverWaitingOffers -> ReceiverAllOffersReceived [label = "neighbour : MakeOffer(offer) && (#totalNbself.receivedOffers == #neighbours-1) && (#self.neighbourValues == #neighbours-1) =>
self.receivedOffers.put(offer)
(chosenOffer, delta) = chooseBestSingleOffer(variable, neighbours, constraints)
self ! BestOffer(chosenOffer, delta)
"];
/*Receives last offer and its a blank one*/
ReceiverWaitingOffers -> ReceiverAllOffersReceived [label = "neighbour : MakeOffer(None) && (#totalNbself.receivedOffers == #neighbours-1) && (#self.neighbourValues == #neighbours-1) =>
(chosenOffer, delta) = chooseBestSingleOffer(variable, neighbours, constraints)
self ! BestOffer(chosenOffer, delta)
"];
/*Receives a neighbour's delta*/
ReceiverWaitingOffers -> ReceiverWaitingOffers [label = "neighbour : InformDelta(delta) =>
stash
"];
/*RECEIVER ALL OFFERS RECEIVED*/
/*Receives a neighbour's delta*/
ReceiverAllOffersReceived -> ReceiverAllOffersReceived [label = "neighbour : InformDelta(delta) =>
stash
"];
/*Receive a void offer from itself: there are no viable offers*/
ReceiverAllOffersReceived -> Uncommitted [label = "self : BestOffer(None, _) =>
unstashall
self.rejectAllUselessOffers(receivedOffers, None)
self.committed = false
self.myDelta = bestUnilateralMove(variable, constraints)
broadcast ! InformDelta(self.myDelta)
"];
/*There is a viable offer*/
ReceiverAllOffersReceived -> Committed [label = "self : BestOffer(theOffer, theDelta) =>
unstashall
self.partner = theOffer.sender
self.committed = true
self.partner ! Accept(theOffer)
myDelta = theDelta
self.neighbourDeltas.put(self, myDelta)
self.rejectAllUselessOffers(receivedOffers, self.partner)
broadcast ! InformDelta(self.myDelta)
"];
/*THE END?*/
/*committed*/
Committed -> Committed [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas < #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
"];
/*uncommitted*/
Uncommitted -> Uncommitted [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas < #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
"];
}
\ No newline at end of file
doc/report/figures/fsm/receiver.png

287 KiB

digraph finite_state_machine {
rankdir=TB;
ratio="fill";
margin=0.1;
node [shape = doublecircle]; Final;
node [shape = circle];
/*THE END ?*/
Continue -> Final [ label = "Supervisor : StopAlgo =>
Nothing
"];
Continue -> Continue [ label = "neighbour : InformValue(v) =>
stash
"];
Continue -> WaitingRoleAssignment [label = "Supervisor : ContinueAlgo =>
self.reset(self.var)
broadcast ! InformValue(self.var.val)
subset = self.determineSubset(threshold)
self ! determineSubset(threshold)
unstashall
"];
/*THE BEGINING*/
init -> Continue [ label = "Supervisor : Trigger =>
unstashall
Supervisor ! KickStartMe
"];
init -> init [ label = "neighbour : InformValue(v) =>
stash
"];
OffererMakingOffer -> Uncommitted [label = "potentialPartner : RejectOffer(offer) =>
unstashall
self.committed = false
myDelta = bestUnilateralMove(variable, constraints)
self.neighbourDeltas.put(self, myDelta)
broadcast ! InformDelta(self.myDelta)
"];
/*Receive a void offer from itself: there are no viable offers*/
ReceiverAllOffersReceived -> Uncommitted [label = "self : BestOffer(None, _) =>
unstashall
self.rejectAllUselessOffers(receivedOffers, None)
self.committed = false
self.myDelta = bestUnilateralMove(variable, constraints)
broadcast ! InformDelta(self.myDelta)
"];
/*THE END?*/
/*uncommitted*/
Uncommitted -> Uncommitted [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas < #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
"];
/*reject*/
Uncommitted -> Uncommitted [label = "neighbour : Reject(someOffer) =>
Nothing
"];
/*reject*/
Uncommitted -> Uncommitted [label = "neighbour : MakeOffer(someOffer) =>
Nothing
"];
/*uncommitted*/
Uncommitted -> ActSolo [label = "neighbour : InformDelta(delta) && (#self.neighbourDeltas == #self.neighbours-1) =>
self.neighbourDeltas.put(neighbour, delta)
amIBest = self.amIBest(self)
self ! Act(shouldAct, move)
"];
/*What an uncommitted agent does*/
ActSolo -> Continue [label = "self : Act(false, move) =>
Supervisor ! InformValue(self.val)
"];
ActSolo -> Continue [label = "self : Act(true, move) =>
newVal = computeNewVal(retainedMove)
self.val = newVal
Supervisor ! InformValue(self.val)
"];
/*No matter what my partner says, when I'm here, I don't care, I won't act*/
Continue -> Continue [label = "self.partner : GiveGo =>
Nothing
"];
Continue -> Continue [label = "self.partner : GiveNogo =>
Nothing
"];
}
\ No newline at end of file
doc/report/figures/fsm/uncommited.png

232 KiB

......@@ -30,9 +30,23 @@ The behaviour of each agent is defined by a finite state automata.
\item \actSolo{}: uncommited agents evaluate their neighbourhood and decide whether they should act or not depending on the neighbourhood's winner.
\item \givingPartnerGNG{}: committed agents evaluate their neighbourhood and decide whether they should act or not depending on the neighbourhood's winner.
\item \handlingGNG{}: committed agents which can act check whether their partner can act too.
\item \final{}:
\item \final{}: the last state an agent can be into, after having received the \stopAlgo{} message from the supervisor.
\end{itemize}
\begin{figure}
\center{\includegraphics[width=\textwidth]{figures/fsm/full_mgm2_agent.png}}
\caption{Complete MGM2 agent automaton}
\label{full_agent}
\end{figure}
\begin{figure}
\center{\includegraphics[width=\textwidth]{figures/fsm/agent_beginning.png}}
\caption{Agent's beginning}
\label{beginning}
\end{figure
\subsubsection{\init}
This is the initial state agents wait in before starting the algorithm.
......@@ -73,6 +87,11 @@ Messages received in this state: \begin{itemize}
\item \chooseSubset{someSubset}: triggers a transition to either \offWaitingValues{} or \recWaitingOffers{} according to the value of \textit{someSubset}.
\end{itemize}
\begin{figure}
\center{\includegraphics[width=\textwidth]{figures/fsm/offerer.png}}
\caption{Offerer agent}
\label{offerer}
\end{figure
\subsubsection{\offWaitingValues{}}
Agents reaching this state are considered offerers.
......@@ -84,7 +103,6 @@ Messages received in this state: \begin{itemize}
\end{itemize}
\subsubsection{\offMakingOff{}}
Before transitioning to the next state, the agent will wait here for the potential partner's response.
Messages received in this state: \begin{itemize}
......@@ -96,6 +114,11 @@ Messages received in this state: \begin{itemize}
\informDelta{\neighbourDeltas.get(self.variable)}: sent to all neighbours after having computed its new delta either through it's partner's \accept{someCombinedMove}'s delta or on its own if it has been rejected with \computeSoloDelta{}.
\end{itemize}
\begin{figure}
\center{\includegraphics[width=\textwidth]{figures/fsm/receiver.png}}
\caption{Receiver agent}
\label{receiver}
\end{figure
\subsubsection{\recWaitingValues{}}
In this state the Receiver agent waits until it has been informed of all its neighbours' values.
......@@ -115,7 +138,6 @@ Messages received in this state: \begin{itemize}
Once all offers have been received, the agent computes the result of\linebreak \determineBestOffer{} and sends it to itself with \bestOfferFM{someOffer} which will be handled in the next state \recHavingRecAllOff{}.
\subsubsection{\recHavingRecAllOff{}}
This state is a fork between committed and uncommitted Receiver agents.
Messages received in this state: \begin{itemize}
......@@ -128,6 +150,11 @@ Messages received in this state: \begin{itemize}
\end{itemize}
In both \bestOfferFM{None/someOffer} cases, \informDelta{someDelta} is sent to all neighbours, containing either the result of \computeJointDelta{someDelta} or \computeSoloDelta{}.
\begin{figure}
\center{\includegraphics[width=\textwidth]{figures/fsm/committed.png}}
\caption{Committed agent}
\label{committed}
\end{figure
\subsubsection{\committed{}}
This state can be reached from \recHavingRecAllOff{} or \offMakingOff{}.
......@@ -137,6 +164,11 @@ Messages received in this state: \begin{itemize}
Once it is computed, the agent will send itself either \shouldAct{true} or \shouldAct{false} depending on whether it has the highest delta of its neighbourhood or not.
\end{itemize}
\begin{figure}
\center{\includegraphics[width=\textwidth]{figures/fsm/uncommitted.png}}
\caption{Uncommitted agent}
\label{uncommitted}
\end{figure
\subsubsection{\uncommitted{}}
Similarly to \committed{}, this state can be reached either from \recHavingRecAllOff{} or \offMakingOff{}.
......@@ -241,6 +273,12 @@ From there, it will branch, either back to the other state or to the final one o
\item \finishState{}: the final state the supervisor ends in after the full algorithm has ended and the stopping condition is met.
\end{itemize}
%\begin{figure}
% \center{\includegraphics[width=\textwidth]{figures/fsm/mgm2_supervisor.png}}
% \caption{Supervisor agent}
% \label{supervisor}
%\end{figure
\subsubsection{\waitingAgentValues}
This is the main state the supervisor spends most time in. Here it collects values from agents in order to make its decision.
Messages received in this state: \begin{itemize}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment