Module tinytroupe.extraction.results_reducer
Expand source code
import pandas as pd
from tinytroupe.extraction import logger
from tinytroupe.agent import TinyPerson
class ResultsReducer:
def __init__(self):
self.results = {}
self.rules = {}
def add_reduction_rule(self, trigger: str, func: callable):
if trigger in self.rules:
raise Exception(f"Rule for {trigger} already exists.")
self.rules[trigger] = func
def reduce_agent(self, agent: TinyPerson) -> list:
reduction = []
for message in agent.episodic_memory.retrieve_all():
if message['role'] == 'system':
continue # doing nothing for `system` role yet at least
elif message['role'] == 'user':
# User role is related to stimuli only
stimulus_type = message['content']['stimuli'][0].get('type', None)
stimulus_content = message['content']['stimuli'][0].get('content', None)
stimulus_source = message['content']['stimuli'][0].get('source', None)
stimulus_timestamp = message['simulation_timestamp']
if stimulus_type in self.rules:
extracted = self.rules[stimulus_type](focus_agent=agent, source_agent=TinyPerson.get_agent_by_name(stimulus_source), target_agent=agent, kind='stimulus', event=stimulus_type, content=stimulus_content, timestamp=stimulus_timestamp)
if extracted is not None:
reduction.append(extracted)
elif message['role'] == 'assistant':
# Assistant role is related to actions only
if 'action' in message['content']:
action_type = message['content']['action'].get('type', None)
action_content = message['content']['action'].get('content', None)
action_target = message['content']['action'].get('target', None)
action_timestamp = message['simulation_timestamp']
if action_type in self.rules:
extracted = self.rules[action_type](focus_agent=agent, source_agent=agent, target_agent=TinyPerson.get_agent_by_name(action_target), kind='action', event=action_type, content=action_content, timestamp=action_timestamp)
if extracted is not None:
reduction.append(extracted)
return reduction
def reduce_agent_to_dataframe(self, agent: TinyPerson, column_names: list=None) -> pd.DataFrame:
reduction = self.reduce_agent(agent)
return pd.DataFrame(reduction, columns=column_names)
Classes
class ResultsReducer
-
Expand source code
class ResultsReducer: def __init__(self): self.results = {} self.rules = {} def add_reduction_rule(self, trigger: str, func: callable): if trigger in self.rules: raise Exception(f"Rule for {trigger} already exists.") self.rules[trigger] = func def reduce_agent(self, agent: TinyPerson) -> list: reduction = [] for message in agent.episodic_memory.retrieve_all(): if message['role'] == 'system': continue # doing nothing for `system` role yet at least elif message['role'] == 'user': # User role is related to stimuli only stimulus_type = message['content']['stimuli'][0].get('type', None) stimulus_content = message['content']['stimuli'][0].get('content', None) stimulus_source = message['content']['stimuli'][0].get('source', None) stimulus_timestamp = message['simulation_timestamp'] if stimulus_type in self.rules: extracted = self.rules[stimulus_type](focus_agent=agent, source_agent=TinyPerson.get_agent_by_name(stimulus_source), target_agent=agent, kind='stimulus', event=stimulus_type, content=stimulus_content, timestamp=stimulus_timestamp) if extracted is not None: reduction.append(extracted) elif message['role'] == 'assistant': # Assistant role is related to actions only if 'action' in message['content']: action_type = message['content']['action'].get('type', None) action_content = message['content']['action'].get('content', None) action_target = message['content']['action'].get('target', None) action_timestamp = message['simulation_timestamp'] if action_type in self.rules: extracted = self.rules[action_type](focus_agent=agent, source_agent=agent, target_agent=TinyPerson.get_agent_by_name(action_target), kind='action', event=action_type, content=action_content, timestamp=action_timestamp) if extracted is not None: reduction.append(extracted) return reduction def reduce_agent_to_dataframe(self, agent: TinyPerson, column_names: list=None) -> pd.DataFrame: reduction = self.reduce_agent(agent) return pd.DataFrame(reduction, columns=column_names)
Methods
def add_reduction_rule(self, trigger: str, func:
) -
Expand source code
def add_reduction_rule(self, trigger: str, func: callable): if trigger in self.rules: raise Exception(f"Rule for {trigger} already exists.") self.rules[trigger] = func
def reduce_agent(self, agent: TinyPerson) ‑> list
-
Expand source code
def reduce_agent(self, agent: TinyPerson) -> list: reduction = [] for message in agent.episodic_memory.retrieve_all(): if message['role'] == 'system': continue # doing nothing for `system` role yet at least elif message['role'] == 'user': # User role is related to stimuli only stimulus_type = message['content']['stimuli'][0].get('type', None) stimulus_content = message['content']['stimuli'][0].get('content', None) stimulus_source = message['content']['stimuli'][0].get('source', None) stimulus_timestamp = message['simulation_timestamp'] if stimulus_type in self.rules: extracted = self.rules[stimulus_type](focus_agent=agent, source_agent=TinyPerson.get_agent_by_name(stimulus_source), target_agent=agent, kind='stimulus', event=stimulus_type, content=stimulus_content, timestamp=stimulus_timestamp) if extracted is not None: reduction.append(extracted) elif message['role'] == 'assistant': # Assistant role is related to actions only if 'action' in message['content']: action_type = message['content']['action'].get('type', None) action_content = message['content']['action'].get('content', None) action_target = message['content']['action'].get('target', None) action_timestamp = message['simulation_timestamp'] if action_type in self.rules: extracted = self.rules[action_type](focus_agent=agent, source_agent=agent, target_agent=TinyPerson.get_agent_by_name(action_target), kind='action', event=action_type, content=action_content, timestamp=action_timestamp) if extracted is not None: reduction.append(extracted) return reduction
def reduce_agent_to_dataframe(self, agent: TinyPerson, column_names: list = None) ‑> pandas.core.frame.DataFrame
-
Expand source code
def reduce_agent_to_dataframe(self, agent: TinyPerson, column_names: list=None) -> pd.DataFrame: reduction = self.reduce_agent(agent) return pd.DataFrame(reduction, columns=column_names)