Skip to content

Commit

Permalink
Senders and Receivers as subclasses. Closes #82
Browse files Browse the repository at this point in the history
  • Loading branch information
stephenfmann committed Jan 22, 2025
1 parent 57860c5 commit 7e720f0
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 20 deletions.
52 changes: 36 additions & 16 deletions evoke/src/evolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -899,10 +899,10 @@ def __init__(self, game, sender_strategies, receiver_strategies):

## Create the agents.
## Sender
self.sender = Agent(sender_strategies)
self.sender = Sender(sender_strategies)

## Receiver
self.receiver = Agent(receiver_strategies)
self.receiver = Receiver(receiver_strategies)

super().__init__(game=game, agents=[self.sender, self.receiver])

Expand Down Expand Up @@ -1036,10 +1036,10 @@ def __init__(self, game, sender_strategies, receiver_strategies):

## Create the agents.
## Sender
self.sender = Agent(sender_strategies)
self.sender = Sender(sender_strategies)

## Receiver
self.receiver = Agent(receiver_strategies)
self.receiver = Receiver(receiver_strategies)

super().__init__(game=game, agents=[self.sender, self.receiver])

Expand Down Expand Up @@ -1086,8 +1086,8 @@ def step(self, calculate_stats=True):
## need to add the new signal to both agents' repertoires.
if signal == len(self.receiver.strategies) - 1 and receiver_payoff == 1:
## It was a new signal
self.sender.add_signal_sender()
self.receiver.add_signal_receiver()
self.sender.add_signal()
self.receiver.add_signal()

## 3. Calculate and store any required variables e.g. information.
if calculate_stats:
Expand Down Expand Up @@ -1156,13 +1156,13 @@ def __init__(

## Create the agents.
## Sender
self.sender = Agent(sender_strategies)
self.sender = Sender(sender_strategies)

## Intermediary
## Intermediary. There is no dedicated intermediary class.
self.intermediary = Agent(intermediary_strategies)

## Receiver
self.receiver = Agent(receiver_strategies)
self.receiver = Receiver(receiver_strategies)

super().__init__(
game=game, agents=[self.sender, self.intermediary, self.receiver]
Expand Down Expand Up @@ -1309,10 +1309,10 @@ def __init__(

## Create the agents.
## Sender
self.sender = Agent(sender_strategies)
self.sender = Sender(sender_strategies)

## Receiver
self.receiver = Agent(receiver_strategies)
self.receiver = Receiver(receiver_strategies)

## Learning parameter
self.learning_parameter = learning_parameter
Expand Down Expand Up @@ -1560,32 +1560,52 @@ def update_strategies_bush_mosteller(
## Now update the strategies
self.strategies[input_data] += ar_delta

def add_signal_sender(self):
@abstractmethod
def add_signal(self):
"""
Add a new signal to the player's repertoire.
"""
Add a new signal to the sender's repertoire.

raise NotImplementedError("This method must be implemented in a subclass.")

class Sender(Agent):
"""
Agent type that observes a state of the world and sends a signal.
"""

def add_signal(self)->None:
"""
Add a signal to the sender's repertoire.
Returns
-------
None.
"""

# Define the new signal array as a column of ones
new_signal_array = np.ones((len(self.strategies), 1))

# Add the new signal to the sender's strategies
self.strategies = np.append(self.strategies, new_signal_array, axis=1)

def add_signal_receiver(self):
class Receiver(Agent):
"""
Agent that receives a signal and performs an action.
"""

def add_signal(self)->None:
"""
Add a new signal to the receiver's repertoire.
Returns
-------
None.
"""

# Define the new signal array as a row of ones.
new_signal_array = np.ones((1, len(self.strategies[0])))

# Add the new signal to the receiver's strategies.
self.strategies = np.append(self.strategies, new_signal_array, axis=0)


Expand Down
11 changes: 7 additions & 4 deletions evoke/tests/test_evolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,8 +412,10 @@ def test_Agent(self):
# Create deterministic strategies
strategies = np.eye(3)

# Create agent object
# Create agent objects
agent = evolve.Agent(strategies)
sender = evolve.Sender(strategies)
receiver = evolve.Receiver(strategies)

# We told the agent to ALWAYS perform act 0 in state 0,
# act 1 in state 1, and act 2 in state 2.
Expand All @@ -437,9 +439,10 @@ def test_Agent(self):
learning_parameter=learning_parameter,
)

# Check adding signals works
agent.add_signal_sender()
agent.add_signal_receiver()
# # Check adding signals works
# agent.add_signal() # Not implemented
sender.add_signal()
receiver.add_signal()

# Check is instance
self.assertIsInstance(agent, evolve.Agent)
Expand Down

0 comments on commit 7e720f0

Please sign in to comment.