UserSyncUI / docs /api /tinytroupe /environment /tiny_social_network.html
harvesthealth's picture
Upload folder using huggingface_hub
f6686e1 verified
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>tinytroupe.environment.tiny_social_network API documentation</title>
<meta name="description" content="" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>tinytroupe.environment.tiny_social_network</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">from tinytroupe.environment.tiny_world import TinyWorld
from tinytroupe.environment import logger
import copy
from datetime import datetime, timedelta
from tinytroupe.agent import *
from tinytroupe.control import transactional
from rich.console import Console
from typing import Any, TypeVar, Union
AgentOrWorld = Union[&#34;TinyPerson&#34;, &#34;TinyWorld&#34;]
class TinySocialNetwork(TinyWorld):
def __init__(self, name, broadcast_if_no_target=True):
&#34;&#34;&#34;
Create a new TinySocialNetwork environment.
Args:
name (str): The name of the environment.
broadcast_if_no_target (bool): If True, broadcast actions through an agent&#39;s available relations
if the target of an action is not found.
&#34;&#34;&#34;
super().__init__(name, broadcast_if_no_target=broadcast_if_no_target)
self.relations = {}
@transactional()
def add_relation(self, agent_1, agent_2, name=&#34;default&#34;):
&#34;&#34;&#34;
Adds a relation between two agents.
Args:
agent_1 (TinyPerson): The first agent.
agent_2 (TinyPerson): The second agent.
name (str): The name of the relation.
&#34;&#34;&#34;
logger.debug(f&#34;Adding relation {name} between {agent_1.name} and {agent_2.name}.&#34;)
# agents must already be in the environment, if not they are first added
if agent_1 not in self.agents:
self.agents.append(agent_1)
if agent_2 not in self.agents:
self.agents.append(agent_2)
if name in self.relations:
self.relations[name].append((agent_1, agent_2))
else:
self.relations[name] = [(agent_1, agent_2)]
return self # for chaining
@transactional()
def _update_agents_contexts(self):
&#34;&#34;&#34;
Updates the agents&#39; observations based on the current state of the world.
&#34;&#34;&#34;
# clear all accessibility first
for agent in self.agents:
agent.make_all_agents_inaccessible()
# now update accessibility based on relations
for relation_name, relation in self.relations.items():
logger.debug(f&#34;Updating agents&#39; observations for relation {relation_name}.&#34;)
for agent_1, agent_2 in relation:
agent_1.make_agent_accessible(agent_2)
agent_2.make_agent_accessible(agent_1)
@transactional()
def _step(self):
self._update_agents_contexts()
#call super
super()._step()
@transactional()
def _handle_reach_out(self, source_agent: TinyPerson, content: str, target: str):
&#34;&#34;&#34;
Handles the REACH_OUT action. This social network implementation only allows
REACH_OUT to succeed if the target agent is in the same relation as the source agent.
Args:
source_agent (TinyPerson): The agent that issued the REACH_OUT action.
content (str): The content of the message.
target (str): The target of the message.
&#34;&#34;&#34;
# check if the target is in the same relation as the source
if self.is_in_relation_with(source_agent, self.get_agent_by_name(target)):
super()._handle_reach_out(source_agent, content, target)
# if we get here, the target is not in the same relation as the source
source_agent.socialize(f&#34;{target} is not in the same relation as you, so you cannot reach out to them.&#34;, source=self)
# TODO implement _handle_talk using broadcast_if_no_target too
#######################################################################
# Utilities and conveniences
#######################################################################
def is_in_relation_with(self, agent_1:TinyPerson, agent_2:TinyPerson, relation_name=None) -&gt; bool:
&#34;&#34;&#34;
Checks if two agents are in a relation. If the relation name is given, check that
the agents are in that relation. If no relation name is given, check that the agents
are in any relation. Relations are undirected, so the order of the agents does not matter.
Args:
agent_1 (TinyPerson): The first agent.
agent_2 (TinyPerson): The second agent.
relation_name (str): The name of the relation to check, or None to check any relation.
Returns:
bool: True if the two agents are in the given relation, False otherwise.
&#34;&#34;&#34;
if relation_name is None:
for relation_name, relation in self.relations.items():
if (agent_1, agent_2) in relation or (agent_2, agent_1) in relation:
return True
return False
else:
if relation_name in self.relations:
return (agent_1, agent_2) in self.relations[relation_name] or (agent_2, agent_1) in self.relations[relation_name]
else:
return False</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="tinytroupe.environment.tiny_social_network.TinySocialNetwork"><code class="flex name class">
<span>class <span class="ident">TinySocialNetwork</span></span>
<span>(</span><span>name, broadcast_if_no_target=True)</span>
</code></dt>
<dd>
<div class="desc"><p>Base class for environments.</p>
<p>Create a new TinySocialNetwork environment.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>name</code></strong> :&ensp;<code>str</code></dt>
<dd>The name of the environment.</dd>
<dt><strong><code>broadcast_if_no_target</code></strong> :&ensp;<code>bool</code></dt>
<dd>If True, broadcast actions through an agent's available relations
if the target of an action is not found.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class TinySocialNetwork(TinyWorld):
def __init__(self, name, broadcast_if_no_target=True):
&#34;&#34;&#34;
Create a new TinySocialNetwork environment.
Args:
name (str): The name of the environment.
broadcast_if_no_target (bool): If True, broadcast actions through an agent&#39;s available relations
if the target of an action is not found.
&#34;&#34;&#34;
super().__init__(name, broadcast_if_no_target=broadcast_if_no_target)
self.relations = {}
@transactional()
def add_relation(self, agent_1, agent_2, name=&#34;default&#34;):
&#34;&#34;&#34;
Adds a relation between two agents.
Args:
agent_1 (TinyPerson): The first agent.
agent_2 (TinyPerson): The second agent.
name (str): The name of the relation.
&#34;&#34;&#34;
logger.debug(f&#34;Adding relation {name} between {agent_1.name} and {agent_2.name}.&#34;)
# agents must already be in the environment, if not they are first added
if agent_1 not in self.agents:
self.agents.append(agent_1)
if agent_2 not in self.agents:
self.agents.append(agent_2)
if name in self.relations:
self.relations[name].append((agent_1, agent_2))
else:
self.relations[name] = [(agent_1, agent_2)]
return self # for chaining
@transactional()
def _update_agents_contexts(self):
&#34;&#34;&#34;
Updates the agents&#39; observations based on the current state of the world.
&#34;&#34;&#34;
# clear all accessibility first
for agent in self.agents:
agent.make_all_agents_inaccessible()
# now update accessibility based on relations
for relation_name, relation in self.relations.items():
logger.debug(f&#34;Updating agents&#39; observations for relation {relation_name}.&#34;)
for agent_1, agent_2 in relation:
agent_1.make_agent_accessible(agent_2)
agent_2.make_agent_accessible(agent_1)
@transactional()
def _step(self):
self._update_agents_contexts()
#call super
super()._step()
@transactional()
def _handle_reach_out(self, source_agent: TinyPerson, content: str, target: str):
&#34;&#34;&#34;
Handles the REACH_OUT action. This social network implementation only allows
REACH_OUT to succeed if the target agent is in the same relation as the source agent.
Args:
source_agent (TinyPerson): The agent that issued the REACH_OUT action.
content (str): The content of the message.
target (str): The target of the message.
&#34;&#34;&#34;
# check if the target is in the same relation as the source
if self.is_in_relation_with(source_agent, self.get_agent_by_name(target)):
super()._handle_reach_out(source_agent, content, target)
# if we get here, the target is not in the same relation as the source
source_agent.socialize(f&#34;{target} is not in the same relation as you, so you cannot reach out to them.&#34;, source=self)
# TODO implement _handle_talk using broadcast_if_no_target too
#######################################################################
# Utilities and conveniences
#######################################################################
def is_in_relation_with(self, agent_1:TinyPerson, agent_2:TinyPerson, relation_name=None) -&gt; bool:
&#34;&#34;&#34;
Checks if two agents are in a relation. If the relation name is given, check that
the agents are in that relation. If no relation name is given, check that the agents
are in any relation. Relations are undirected, so the order of the agents does not matter.
Args:
agent_1 (TinyPerson): The first agent.
agent_2 (TinyPerson): The second agent.
relation_name (str): The name of the relation to check, or None to check any relation.
Returns:
bool: True if the two agents are in the given relation, False otherwise.
&#34;&#34;&#34;
if relation_name is None:
for relation_name, relation in self.relations.items():
if (agent_1, agent_2) in relation or (agent_2, agent_1) in relation:
return True
return False
else:
if relation_name in self.relations:
return (agent_1, agent_2) in self.relations[relation_name] or (agent_2, agent_1) in self.relations[relation_name]
else:
return False</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li><a title="tinytroupe.environment.tiny_world.TinyWorld" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld">TinyWorld</a></li>
</ul>
<h3>Methods</h3>
<dl>
<dt id="tinytroupe.environment.tiny_social_network.TinySocialNetwork.add_relation"><code class="name flex">
<span>def <span class="ident">add_relation</span></span>(<span>*args, **kwargs)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def wrapper(*args, **kwargs):
obj_under_transaction = args[0]
simulation = current_simulation()
obj_sim_id = obj_under_transaction.simulation_id if hasattr(obj_under_transaction, &#39;simulation_id&#39;) else None
logger.debug(f&#34;-----------------------------------------&gt; Transaction: {func.__name__} with args {args[1:]} and kwargs {kwargs} under simulation {obj_sim_id}, parallel={parallel}.&#34;)
parallel_id = str(threading.current_thread())
transaction = Transaction(obj_under_transaction, simulation, func, *args, **kwargs)
result = transaction.execute(begin_parallel=parallel, parallel_id=parallel_id)
return result</code></pre>
</details>
</dd>
<dt id="tinytroupe.environment.tiny_social_network.TinySocialNetwork.is_in_relation_with"><code class="name flex">
<span>def <span class="ident">is_in_relation_with</span></span>(<span>self, agent_1: <a title="tinytroupe.agent.tiny_person.TinyPerson" href="../agent/tiny_person.html#tinytroupe.agent.tiny_person.TinyPerson">TinyPerson</a>, agent_2: <a title="tinytroupe.agent.tiny_person.TinyPerson" href="../agent/tiny_person.html#tinytroupe.agent.tiny_person.TinyPerson">TinyPerson</a>, relation_name=None) ‑> bool</span>
</code></dt>
<dd>
<div class="desc"><p>Checks if two agents are in a relation. If the relation name is given, check that
the agents are in that relation. If no relation name is given, check that the agents
are in any relation. Relations are undirected, so the order of the agents does not matter.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>agent_1</code></strong> :&ensp;<code>TinyPerson</code></dt>
<dd>The first agent.</dd>
<dt><strong><code>agent_2</code></strong> :&ensp;<code>TinyPerson</code></dt>
<dd>The second agent.</dd>
<dt><strong><code>relation_name</code></strong> :&ensp;<code>str</code></dt>
<dd>The name of the relation to check, or None to check any relation.</dd>
</dl>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>bool</code></dt>
<dd>True if the two agents are in the given relation, False otherwise.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def is_in_relation_with(self, agent_1:TinyPerson, agent_2:TinyPerson, relation_name=None) -&gt; bool:
&#34;&#34;&#34;
Checks if two agents are in a relation. If the relation name is given, check that
the agents are in that relation. If no relation name is given, check that the agents
are in any relation. Relations are undirected, so the order of the agents does not matter.
Args:
agent_1 (TinyPerson): The first agent.
agent_2 (TinyPerson): The second agent.
relation_name (str): The name of the relation to check, or None to check any relation.
Returns:
bool: True if the two agents are in the given relation, False otherwise.
&#34;&#34;&#34;
if relation_name is None:
for relation_name, relation in self.relations.items():
if (agent_1, agent_2) in relation or (agent_2, agent_1) in relation:
return True
return False
else:
if relation_name in self.relations:
return (agent_1, agent_2) in self.relations[relation_name] or (agent_2, agent_1) in self.relations[relation_name]
else:
return False</code></pre>
</details>
</dd>
</dl>
<h3>Inherited members</h3>
<ul class="hlist">
<li><code><b><a title="tinytroupe.environment.tiny_world.TinyWorld" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld">TinyWorld</a></b></code>:
<ul class="hlist">
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.add_agent" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.add_agent">add_agent</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.add_agents" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.add_agents">add_agents</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.add_environment" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.add_environment">add_environment</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.add_intervention" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.add_intervention">add_intervention</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.clear_communications_buffer" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.clear_communications_buffer">clear_communications_buffer</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.clear_environments" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.clear_environments">clear_environments</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.decode_complete_state" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.decode_complete_state">decode_complete_state</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.encode_complete_state" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.encode_complete_state">encode_complete_state</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.get_agent_by_name" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.get_agent_by_name">get_agent_by_name</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.get_environment_by_name" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.get_environment_by_name">get_environment_by_name</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.make_everyone_accessible" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.make_everyone_accessible">make_everyone_accessible</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.pop_and_display_latest_communications" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.pop_and_display_latest_communications">pop_and_display_latest_communications</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.pp_current_interactions" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.pp_current_interactions">pp_current_interactions</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.pretty_current_interactions" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.pretty_current_interactions">pretty_current_interactions</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.remove_agent" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.remove_agent">remove_agent</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.remove_all_agents" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.remove_all_agents">remove_all_agents</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.run_days" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.run_days">run_days</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.run_hours" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.run_hours">run_hours</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.run_minutes" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.run_minutes">run_minutes</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.run_months" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.run_months">run_months</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.run_weeks" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.run_weeks">run_weeks</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.run_years" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.run_years">run_years</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.set_simulation_for_free_environments" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.set_simulation_for_free_environments">set_simulation_for_free_environments</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.skip_days" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.skip_days">skip_days</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.skip_hours" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.skip_hours">skip_hours</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.skip_minutes" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.skip_minutes">skip_minutes</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.skip_months" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.skip_months">skip_months</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.skip_weeks" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.skip_weeks">skip_weeks</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_world.TinyWorld.skip_years" href="tiny_world.html#tinytroupe.environment.tiny_world.TinyWorld.skip_years">skip_years</a></code></li>
</ul>
</li>
</ul>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="tinytroupe.environment" href="index.html">tinytroupe.environment</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="tinytroupe.environment.tiny_social_network.TinySocialNetwork" href="#tinytroupe.environment.tiny_social_network.TinySocialNetwork">TinySocialNetwork</a></code></h4>
<ul class="">
<li><code><a title="tinytroupe.environment.tiny_social_network.TinySocialNetwork.add_relation" href="#tinytroupe.environment.tiny_social_network.TinySocialNetwork.add_relation">add_relation</a></code></li>
<li><code><a title="tinytroupe.environment.tiny_social_network.TinySocialNetwork.is_in_relation_with" href="#tinytroupe.environment.tiny_social_network.TinySocialNetwork.is_in_relation_with">is_in_relation_with</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>