Algorithm~\ref{algo:MGM-2} and its sub-algorithms\ref{algo:MGM-2-inform}, \ref{algo:MGM-2-offer}, \ref{algo:MGM-2-evaluate}, \ref{algo:MGM-2-inform2} and \ref{algo:MGM-2-go-no-go} present MGM-2.
\begin{algorithm}
\begin{algorithm}
\DontPrintSemicolon
\DontPrintSemicolon
...
@@ -227,20 +254,43 @@ a boolean b set to true if the goal is miniMax, false if maxiMin}
...
@@ -227,20 +254,43 @@ a boolean b set to true if the goal is miniMax, false if maxiMin}
\KwOutput{A solution to the DCOP}
\KwOutput{A solution to the DCOP}
\While{not terminated}
\While{not terminated}
{
{
Inform: \For{each agent $a_i$ in A}{
Inform\\
Determine offerers/receivers as resp. O and R\\
Offer\\
Evaluate\\
Inform2\\
Go/No-Go \\
The agent with $max(bm_x)$ wins the round and is allowed to act
}
\caption{MGM-2}
\label{algo:MGM-2}
\end{algorithm}
\begin{algorithm}
\For{each agent $a_i$ in A}{
\For{each agent $a_j$ in A}{
\For{each agent $a_j$ in A}{
\If{$a_i$ and $a_j$ share a function $f_m$}{
\If{$a_i$ and $a_j$ share a function $f_m$}{
$a_i$ informs $a_j$ of the $x_i$ value it controls in $f_m$
$a_i$ informs $a_j$ of the $x_i$ value it controls in $f_m$
}
}
}
}
}
}
Determine offerers/receivers as resp. O and R\\
\caption{MGM-2 Inform }
Offer: \For{each agent $a_i$ in O}{
\label{algo:MGM-2-inform}
\end{algorithm}
\begin{algorithm}
\For{each agent $a_i$ in O}{
offerer sends $(a_i,a_j,gain^O(a_i,a_j))$ where $gain^O(a_i,a_j))$ is offerer's \textbf{local utility gain} for suggested values $a_i$ and $a_j$.
offerer sends $(a_i,a_j,gain^O(a_i,a_j))$ where $gain^O(a_i,a_j))$ is offerer's \textbf{local utility gain} for suggested values $a_i$ and $a_j$.
Chose at random an agent $a_j$ in R sharing a function $f_m$ with self
Chose at random an agent $a_j$ in R sharing a function $f_m$ with self
Send offer message containing all coordinated moves for the pair $(a_i,a_j)$ which improve current $f_m$
Send offer message containing all coordinated moves for the pair $(a_i,a_j)$ which improve current $f_m$
}
}
Evaluate: \For{each agent $a_i$ in R}{
\caption{MGM-2 Offer}
\label{algo:MGM-2-offer}
\end{algorithm}
\begin{algorithm}
\For{each agent $a_i$ in R}{
Compute improvement $\delta$ achievable, taking into account $f_m$ offer and its own function $f_n$\\
Compute improvement $\delta$ achievable, taking into account $f_m$ offer and its own function $f_n$\\
If $gain^R(a_i,a_j)$ is receiver's \textbf{local utility }gain for suggested values $a_i$ and $a_j$\\
If $gain^R(a_i,a_j)$ is receiver's \textbf{local utility }gain for suggested values $a_i$ and $a_j$\\
for each $(a_i,a_j)$, compute $globalGain(a_i,a_j)= gain^R(a_i,a_j)+gain^O(a_i,a_j)-\Delta(a_i,a_j)$ where $\Delta(a_i,a_j)$ = how much ``link between both'' changes using $(a_i,a_j)$ ( not very clear in Mashewaran (fin page 4)).)\\
for each $(a_i,a_j)$, compute $globalGain(a_i,a_j)= gain^R(a_i,a_j)+gain^O(a_i,a_j)-\Delta(a_i,a_j)$ where $\Delta(a_i,a_j)$ = how much ``link between both'' changes using $(a_i,a_j)$ ( not very clear in Mashewaran (fin page 4)).)\\
...
@@ -249,7 +299,12 @@ a boolean b set to true if the goal is miniMax, false if maxiMin}
...
@@ -249,7 +299,12 @@ a boolean b set to true if the goal is miniMax, false if maxiMin}
Offerer and receiver are now committed
Offerer and receiver are now committed
}
}
}
}
Inform: \For{each agent in A}{
\caption{MGM-2 Evaluate}
\label{algo:MGM-2-evaluate}
\end{algorithm}
\begin{algorithm}
For{each agent in A}{
Send a gain message to all neighbours\\
Send a gain message to all neighbours\\
\If{agent is committed}{
\If{agent is committed}{
Gain message is for coordinated move
Gain message is for coordinated move
...
@@ -258,7 +313,12 @@ a boolean b set to true if the goal is miniMax, false if maxiMin}
...
@@ -258,7 +313,12 @@ a boolean b set to true if the goal is miniMax, false if maxiMin}
Gain message is best $bm$ for unilateral move
Gain message is best $bm$ for unilateral move
}
}
}
}
Go/No-Go: \For{each agent $a_i$ in A}{
\caption{MGM-2 Inform2}
\label{algo:MGM-2-inform2}
\end{algorithm}
\begin{algorithm}
\For{each agent $a_i$ in A}{
\If{$a_i$ is in C}{
\If{$a_i$ is in C}{
\If{$a_i$'s offer was the best of the neighbourhood}{
\If{$a_i$'s offer was the best of the neighbourhood}{
$a_i$ send its committed partner $a_j$ a \textit{go} message
$a_i$ send its committed partner $a_j$ a \textit{go} message
...
@@ -271,9 +331,8 @@ a boolean b set to true if the goal is miniMax, false if maxiMin}
...
@@ -271,9 +331,8 @@ a boolean b set to true if the goal is miniMax, false if maxiMin}
Uncommitted agents act if their offer was the best in their neighbourhood
Uncommitted agents act if their offer was the best in their neighbourhood
}
}
}
}
The agent with $max(bm_x)$ wins the round and is allowed to act
@@ -6,7 +6,7 @@ Agents systematically base their decision on their local knowledge.
...
@@ -6,7 +6,7 @@ Agents systematically base their decision on their local knowledge.
The process is triggered by a supervisor agent who invites other agents to begin their rounds of interactions.
The process is triggered by a supervisor agent who invites other agents to begin their rounds of interactions.
Each agent $a_i$ is sent a \beginAlgo{} message by the supervisor and initiates its variable's value at random in the variable's domain.
Each agent $a_i$ is sent a \beginAlgo{} message by the supervisor and initiates its variable's value at random in the variable's domain.
The behaviour of each agent is defined by a finite state automata.
The behaviour of each agent is defined by a finite state automata (see Figure~\ref{full_agent} for the big picture and Figures~\ref{beginning}, \ref{offerer}, \ref{receiver}, \ref{committed} and \ref{uncommitted} for focused extracts ).
\subsection{ Agent States}
\subsection{ Agent States}
...
@@ -55,7 +55,7 @@ Messages received in this state are: \begin{itemize}
...
@@ -55,7 +55,7 @@ Messages received in this state are: \begin{itemize}
\item\beginAlgo{}: upon receiving a \beginAlgo, sent by the supervisor,
\item\beginAlgo{}: upon receiving a \beginAlgo, sent by the supervisor,
%
%
agent performs a \initRandomVal{\val.domain} operation, this method is called only once per algorithm execution for each agent.
agent performs a \initRandomVal{\val.domain} operation, this me\-thod is called only once per algorithm execution for each agent.
%
%
The agent unstashes all previous \informVal{} stashed messages and sends a \kickStart{} message to the Supervisor.
The agent unstashes all previous \informVal{} stashed messages and sends a \kickStart{} message to the Supervisor.
%
%
...
@@ -76,7 +76,7 @@ Messages received in this state: \begin{itemize}
...
@@ -76,7 +76,7 @@ Messages received in this state: \begin{itemize}
\item\giveNoGo{}: If the agent has reached this state after completing a round where it had been committed but could not act because it did not win the neighbourhood's delta competition, it will receive its partners' \giveGo{} or \giveNoGo{} here, but nothing should be done about it.
\item\giveNoGo{}: If the agent has reached this state after completing a round where it had been committed but could not act because it did not win the neighbourhood's delta competition, it will receive its partners' \giveGo{} or \giveNoGo{} here, but nothing should be done about it.
\item\stopAlgo{}: agent transitions to \final{} with the whole process terminating
\item\stopAlgo{}: agent transitions to \final{} with the whole process terminating
\item\continueAlgo{}: agent called \reset{} method, emptying\linebreak\receivedOffers{}, \neighbourValues{} and \neighbourDeltas{}.
\item\continueAlgo{}: agent called \reset{} method, emptying\linebreak\receivedOffers{}, \neighbourValues{} and \neighbourDeltas{}.
early received \informVal{} messages are unstashed, then the agent sends its own value via \informVal{\val} to all its neighbours. It performs \determineSubset{} and send the outcome to self via \chooseSubset{} before transitioning to \waitingForRole{} where \chooseSubset{} will be dealt with as well as unstashed \informVal{}.
early received \informVal{} messages are unstashed, then the agent sends its own value via \informVal{\val} to all its neighbours. It performs \determineSubset{} and send the outcome to self via \linebreak\chooseSubset{} before transitioning to \waitingForRole{} where \chooseSubset{} will be dealt with as well as unstashed \informVal{}.
\end{itemize}
\end{itemize}
...
@@ -84,7 +84,7 @@ Messages received in this state: \begin{itemize}
...
@@ -84,7 +84,7 @@ Messages received in this state: \begin{itemize}
This state acts as a crossroads between paths as Offerer or Receiver.
This state acts as a crossroads between paths as Offerer or Receiver.
Messages received in this state: \begin{itemize}
Messages received in this state: \begin{itemize}
\item\informVal{someVal}: are stashed to be dealt with when leaving this state for the targeted next one.
\item\informVal{someVal}: are stashed to be dealt with when leaving this state for the targeted next one.
\item\chooseSubset{someSubset}: triggers a transition to either \offWaitingValues{} or \recWaitingOffers{} according to the value of \textit{someSubset}.
\item\chooseSubset{someSubset}: triggers a transition to either\linebreak\offWaitingValues{} or \recWaitingOffers{} according to the value of \textit{someSubset}.
\end{itemize}
\end{itemize}
\begin{figure}
\begin{figure}
...
@@ -108,10 +108,10 @@ Before transitioning to the next state, the agent will wait here for the potenti
...
@@ -108,10 +108,10 @@ Before transitioning to the next state, the agent will wait here for the potenti
Messages received in this state: \begin{itemize}
Messages received in this state: \begin{itemize}
\item\makeOff{someOffer}: message is still answered with a \reject.
\item\makeOff{someOffer}: message is still answered with a \reject.
\item\informDelta{someDelta}: messages received from neighbours which are one step ahead are stashed at this stage.
\item\informDelta{someDelta}: messages received from neighbours which are one step ahead are stashed at this stage.
\item\accept{someCombinedMove}: it will transition to committed and set \commitment{} to true as well as set \partner{} to \accept{someOffer}'s sender, this data will also help to compute the new delta.\\
\item\accept{someCombinedMove}: it will transition to committed and set \commitment{} to true as well as set \partner{} to \linebreak\accept{someOffer}'s sender, this data will also help to compute the new delta.\\
\informDelta{\neighbourDeltas.get(self.variable)} is 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{}.
\informDelta{\neighbourDeltas.get(self.variable)} is sent to all neighbours after having computed its new delta either through it's partner's \linebreak\accept{someCombinedMove}'s delta or on its own if it has been rejected with \computeSoloDelta{}.
\item\reject{someOffer}: the agent will transition to \uncommitted{}, set \commitment{} to true and set \partner{} to \texttt{None}.
\item\reject{someOffer}: the agent will transition to \uncommitted{}, set\linebreak\commitment{} to true and set \partner{} to \texttt{None}.
\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{}.
\\\informDelta{\neighbourDeltas.get(self.variable)} is sent to all neighbours after having computed its new delta either through it's partner's\linebreak\accept{someCombinedMove}'s delta or on its own if it has been rejected with \computeSoloDelta{}.
\end{itemize}
\end{itemize}
\begin{figure}
\begin{figure}
...
@@ -125,17 +125,17 @@ In this state the Receiver agent waits until it has been informed of all its nei
...
@@ -125,17 +125,17 @@ In this state the Receiver agent waits until it has been informed of all its nei
Messages received in this state: \begin{itemize}
Messages received in this state: \begin{itemize}
\item\informVal{someVal}: are stored in the \neighbourValues{} map and become relevant only if the receiver does not get any acceptable offer.
\item\informVal{someVal}: are stored in the \neighbourValues{} map and become relevant only if the receiver does not get any acceptable offer.
Once all of them have been received, the agent transitions to \recWaitingOffers{}.
Once all of them have been received, the agent transitions to \recWaitingOffers{}.
\item\makeOff{None/someOffer}: are stashed to be handled in \recWaitingOffers{}.
\item\makeOff{None/someOffer}: are stashed to be handled in\linebreak\recWaitingOffers{}.
\end{itemize}
\end{itemize}
\subsubsection{\recWaitingOffers{}}
\subsubsection{\recWaitingOffers{}}
The last offer to be received causes the transition to the next state.
The last offer to be received causes the transition to the next state.
At the end, when the last offer is received, whether the agent has received a real or \texttt{None} last offer, it will process the list of real offers received with \linebreak\determineBestOffer{}.
At the end, when the last offer is received, whether the agent has received a real or \texttt{None} last offer, it will process the list of real offers received with \linebreak\determineBestOffer{}.\\
Messages received in this state: \begin{itemize}
Messages received in this state: \begin{itemize}
\item\makeOff{someOffer}: stored in \receivedOffers{} map until all offers have been received.
\item\makeOff{someOffer}: stored in \receivedOffers{} map until all offers have been received.
\item\makeOff{None}: a counter is simply increased to keep track of the number and know when all offers ahev been received.
\item\makeOff{None}: a counter is simply increased to keep track of the number and know when all offers ahev been received.
\end{itemize}
\end{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{}.
Once all offers have been received, the agent computes the result of\linebreak\determineBestOffer{} and \linebreaksends it to itself with \bestOfferFM{someOffer} which will be handled in the next state \recHavingRecAllOff{}.
\subsubsection{\recHavingRecAllOff{}}
\subsubsection{\recHavingRecAllOff{}}
...
@@ -144,20 +144,20 @@ Messages received in this state: \begin{itemize}
...
@@ -144,20 +144,20 @@ Messages received in this state: \begin{itemize}
\item\informDelta{someDelta}: will be stashed and handled in either \committed{} or \uncommitted{}.
\item\informDelta{someDelta}: will be stashed and handled in either \committed{} or \uncommitted{}.
\item\bestOfferFM{someOffer}: will cause the agent to transition to \committed{}, setting \commitment{} to \texttt{true} and setting its \partner{} variable to the agent it has committed with.
\item\bestOfferFM{someOffer}: will cause the agent to transition to \committed{}, setting \commitment{} to \texttt{true} and setting its \partner{} variable to the agent it has committed with.
the agent's current delta value is computed with \computeJointDelta{somePartner}.
the agent's current delta value is computed with \computeJointDelta{somePartner}.
it will send a \reject{} to all neighbours which are not the partner and an \accept{someCombinedMove} to the chosen partner.
It will send a \reject{} to all neighbours which are not the partner and an\linebreak\accept{someCombinedMove} to the chosen partner.
\item\bestOfferFM{None}: will cause the agent to transition to \uncommitted{} and set its \commitment{} to \texttt{false}.
\item\bestOfferFM{None}: will cause the agent to transition to \uncommitted{} and set its \commitment{} to \texttt{false}.
It will send a \reject{} to all neighbours. The agent's current delta value is computed with \linebreak\computeSoloDelta{} and added to \neighbourDeltas.
It will send a \reject{} to all neighbours. The agent's current delta value is computed with \linebreak\computeSoloDelta{} and added to \linebreak\neighbourDeltas.
\end{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{}.
In both \bestOfferFM{None/someOffer} cases, \informDelta{someDelta} is sent to all neighbours, containing either the result of \linebreak\computeJointDelta{someDelta} or \linebreak\computeSoloDelta{}.
This state can be reached from \recHavingRecAllOff{} or \offMakingOff{}.
This state can be reached from \recHavingRecAllOff{} or \linebreak\offMakingOff{}.
Messages received in this state: \begin{itemize}
Messages received in this state: \begin{itemize}
\item\informDelta{someDelta}: messages are added to \neighbourDeltas{} until they have been received from all neighbours.
\item\informDelta{someDelta}: messages are added to \neighbourDeltas{} until they have been received from all neighbours.
When all deltas have been received, the best delta of the neighbourhood can be computed.
When all deltas have been received, the best delta of the neighbourhood can be computed.
...
@@ -171,7 +171,7 @@ Messages received in this state: \begin{itemize}
...
@@ -171,7 +171,7 @@ Messages received in this state: \begin{itemize}
\end{figure}
\end{figure}
\subsubsection{\uncommitted{}}
\subsubsection{\uncommitted{}}
Similarly to \committed{}, this state can be reached either from \recHavingRecAllOff{} or \offMakingOff{}.
Similarly to \committed{}, this state can be reached either from\linebreak\recHavingRecAllOff{} or \offMakingOff{}.
Messages received in this state: \begin{itemize}
Messages received in this state: \begin{itemize}
\item\informDelta{someDelta}: are added to \neighbourDeltas{} until it they have been received from all neighbours.
\item\informDelta{someDelta}: are added to \neighbourDeltas{} until it they have been received from all neighbours.
Once all deltas have been received, it will compute whether it should act or not based on neighbourhood deltas and send either send \shouldAct{true} or \shouldAct{false} and transition to \actSolo{}.
Once all deltas have been received, it will compute whether it should act or not based on neighbourhood deltas and send either send \shouldAct{true} or \shouldAct{false} and transition to \actSolo{}.
...
@@ -182,7 +182,7 @@ Messages received in this state: \begin{itemize}
...
@@ -182,7 +182,7 @@ Messages received in this state: \begin{itemize}
Here the uncommitted agent processes the \shouldAct{true/false} message, it will transition to \continue{} either way.
Here the uncommitted agent processes the \shouldAct{true/false} message, it will transition to \continue{} either way.
Messages received in this state: \begin{itemize}
Messages received in this state: \begin{itemize}
\item\shouldAct{true}: \val{} will be updated to \computeNewVal{}, inform supervisor of current value with \informVal{\val}.
\item\shouldAct{true}: \val{} will be updated to \computeNewVal{}, inform supervisor of current value with \informVal{\val}.
\item\shouldAct{false}: nothing except inform supervisor of current value with \informVal{\val}.
\item\shouldAct{false}: nothing except inform supervisor of current value with \linebreak\informVal{\val}.
\end{itemize}
\end{itemize}
...
@@ -192,7 +192,7 @@ Hence the agent migh receive its partner's \giveGo{} or \giveNoGo{} message whic
...
@@ -192,7 +192,7 @@ Hence the agent migh receive its partner's \giveGo{} or \giveNoGo{} message whic
In any case, the agent handles the self-sent message \shouldAct{true/false}.
In any case, the agent handles the self-sent message \shouldAct{true/false}.
Messages received in this state: \begin{itemize}
Messages received in this state: \begin{itemize}
\item\shouldAct{false}: it will send its partner a \giveNoGo{} signal and transition to \continue{} by sending the Supervisor the \informVal{\val}.
\item\shouldAct{false}: it will send its partner a \giveNoGo{} signal and transition to \continue{} by sending the Supervisor the \informVal{\val}.
\item\shouldAct{true}: the agent sends its partner a \giveGo{} and transitions to \handlingGNG{}.
\item\shouldAct{true}: the agent sends its partner a \giveGo{} and transitions to \linebreak\handlingGNG{}.
\end{itemize}
\end{itemize}
...
@@ -234,7 +234,7 @@ In order to carry out negotiations, exchange information and coordiante themselv
...
@@ -234,7 +234,7 @@ In order to carry out negotiations, exchange information and coordiante themselv
Each message can only be handled in dedicated states and will therefore be stashed for later use when received in a non-dedicated state.
Each message can only be handled in dedicated states and will therefore be stashed for later use when received in a non-dedicated state.
\subsubsection{Standard agent messages}
\subsubsection{Standard agent messages}
\begin{itemize}
\begin{itemize}
\item\kickStart{}: is sent by the agent at the very begining of the process to indicate to the Supervisor that it needs to send it the initial \continueAlgo message.
\item\kickStart{}: is sent by the agent at the very begining of the process to indicate to the Supervisor that it needs to send it the initial \continueAlgo{} message.
\item\chooseSubset{Offerer/Receiver}: is sent by the agent to itself, sent in the \waitingForRole{} state and then causing the transition towards either \offWaitingValues{} or \recWaitingOffers{}. This message determines the path the agent threads for the next two states before joigning again in the \uncommitted{}/\uncommitted{} states.
\item\chooseSubset{Offerer/Receiver}: is sent by the agent to itself, sent in the \waitingForRole{} state and then causing the transition towards either \offWaitingValues{} or \recWaitingOffers{}. This message determines the path the agent threads for the next two states before joigning again in the \uncommitted{}/\uncommitted{} states.
\item\informVal{someVal}: is sent by an agent to all neighbouring agents in state \waitingForRole{}.
\item\informVal{someVal}: is sent by an agent to all neighbouring agents in state \waitingForRole{}.
\item\informDelta{\neighbourDeltas.get(self.variable)}: is sent by an agent which has computed its solo or joint delta to its neighbourhood upon transitioning to either \uncommitted{} or \uncommitted{} states.
\item\informDelta{\neighbourDeltas.get(self.variable)}: is sent by an agent which has computed its solo or joint delta to its neighbourhood upon transitioning to either \uncommitted{} or \uncommitted{} states.
...
@@ -268,7 +268,7 @@ From there, it will branch, either back to the other state or to the final one o
...
@@ -268,7 +268,7 @@ From there, it will branch, either back to the other state or to the final one o
\subsubsection{General overview}
\subsubsection{General overview}
\begin{itemize}
\begin{itemize}
\item\waitingAgentValues{}: the main state where supervisor waits for agents' information.
\item\waitingAgentValues{}: the main state where supervisor waits for agents' information.
\item\startState{}: the state in which the supervisor starts, from there it broadcasts the \trigger message to all agents and directly goes to \waitingAgentValues.
\item\startState{}: the state in which the supervisor starts, from there it broadcasts the \trigger message to all agents and directly goes to \linebreak\waitingAgentValues.
\item\decidingStopContinue{}: state in which the supervisor checks whether the stopping condition has been met or not.
\item\decidingStopContinue{}: state in which the supervisor checks whether the stopping condition has been met or not.
\item\finishState{}: the final state the supervisor ends in after the full algorithm has ended and the stopping condition is met.
\item\finishState{}: the final state the supervisor ends in after the full algorithm has ended and the stopping condition is met.
\end{itemize}
\end{itemize}
...
@@ -283,7 +283,7 @@ From there, it will branch, either back to the other state or to the final one o
...
@@ -283,7 +283,7 @@ From there, it will branch, either back to the other state or to the final one o
This is the main state the supervisor spends most time in. Here it collects values from agents in order to make its decision.
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}
Messages received in this state: \begin{itemize}
\item\kickStart{}: this is directly answered with a \continueAlgo{} message.
\item\kickStart{}: this is directly answered with a \continueAlgo{} message.
\item\informVal{someVal}: these messages are put into the supervisors' \currentContext until it is filled.
\item\informVal{someVal}: these messages are put into the supervisors' \linebreak\currentContext until it is filled.
The last one triggers a transition to \decidingStopContinue{}.
The last one triggers a transition to \decidingStopContinue{}.
\end{itemize}
\end{itemize}
...
@@ -301,7 +301,7 @@ Final state of the automaton, no messages are received here.
...
@@ -301,7 +301,7 @@ Final state of the automaton, no messages are received here.
\subsection{Supervisor's mental state}
\subsection{Supervisor's mental state}
The supervisor only handles one mental state variable: \currentContext{}.
The supervisor only handles one mental state variable:\linebreak\currentContext{}.
In it it stores the current values all variables have.
In it it stores the current values all variables have.