Skip to content
This repository has been archived by the owner on Feb 11, 2025. It is now read-only.

Commit

Permalink
Add sequences to behavior library and rename nickname to display_name
Browse files Browse the repository at this point in the history
  • Loading branch information
jashlu committed Sep 26, 2024
1 parent b836c23 commit 5c1e477
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 47 deletions.
9 changes: 5 additions & 4 deletions src/social_norms_trees/behavior_library.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
class BehaviorLibrary:
def __init__(self, behaviors):
self.behaviors = behaviors
def __init__(self, behavior_list):
self.behaviors = {behavior["display_name"]: behavior for behavior in behavior_list}

def get_behavior_by_nickname(self, nickname):
return self.behaviors.get(nickname)

def get_behavior_by_display_name(self, display_name):
return self.behaviors.get(display_name)

def get_behavior_by_id(self, id_):
for behavior in self.behaviors.values():
Expand Down
13 changes: 11 additions & 2 deletions src/social_norms_trees/custom_node_library.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
import py_trees

class CustomBehavior(py_trees.behaviours.Dummy):
def __init__(self, name, id_, nickname):
def __init__(self, name, id_, display_name):
super().__init__(name)
self.id_ = id_
self.nickname = nickname
self.display_name = display_name


class CustomSequence(py_trees.composites.Sequence):
def __init__(self, name, id_, display_name, children=None, memory=False):
super().__init__(name=name, memory=memory)
self.id_ = id_
self.display_name = display_name

if children:
self.add_children(children)


# id of the behavior within the behavior library (persists)
# but also the unique id for the behavior within the tree (in case there are multiple instances of
Expand Down
18 changes: 9 additions & 9 deletions src/social_norms_trees/mutate_tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ def remove_node(tree: T, node: Optional[py_trees.behaviour.Behaviour] = None) ->
"nodes": [
{
"id_": node.id_,
"nickname": node.nickname
"display_name": node.display_name
},
],
"timestamp": datetime.now().isoformat(),
Expand Down Expand Up @@ -398,7 +398,7 @@ def move_node(
"nodes": [
{
"id": node.id_,
"nickname": node.nickname,
"display_name": node.display_name,
},
],
"timestamp": datetime.now().isoformat(),
Expand Down Expand Up @@ -474,28 +474,28 @@ def exchange_nodes(
if node0.__class__.__name__ != "CustomBehavior":
nodes.append(
{
"nickname": node0.name,
"display_name": node0.name,
}
)
else:
nodes.append(
{
"id": node0.id_,
"nickname": node0.nickname
"display_name": node0.display_name
}
)

if node1.__class__.__name__ != "CustomBehavior":
nodes.append(
{
"nickname": node1.name,
"display_name": node1.display_name,
}
)
else:
nodes.append(
{
"id": node1.id_,
"nickname": node1.nickname
"display_name": node1.display_name
}
)

Expand Down Expand Up @@ -538,9 +538,9 @@ def add_node(
behavior = prompt_select_node(behavior_library, f"Which behavior do you want to add?")

new_node = CustomBehavior(
name=behavior['nickname'],
name=behavior['display_name'],
id_=behavior['id'],
nickname=behavior['nickname']
display_name=behavior['display_name']
)

new_parent = prompt_identify_parent_node(
Expand All @@ -557,7 +557,7 @@ def add_node(
"type": "add_node",
"node": {
"id": new_node.id_,
"nickname": new_node.nickname
"display_name": new_node.display_name
},
"timestamp": datetime.now().isoformat(),
}
Expand Down
78 changes: 51 additions & 27 deletions src/social_norms_trees/resources.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,48 +57,72 @@
}
]
},
"behavior_library":
"behavior_library": [
{
"Behavior A": {
"id": "001",
"nickname": "Behavior A",
"type": "Dummy"
"display_name": "Behavior A",
"type": "Dummy",
"show": true
},
"Behavior B": {
{
"id": "002",
"nickname": "Behavior B",
"type": "Dummy"
"display_name": "Behavior B",
"type": "Dummy",
"show": true
},
"Behavior C": {
{
"id": "003",
"nickname": "Behavior C",
"type": "Dummy"
"display_name": "Behavior C",
"type": "Dummy",
"show": true
},
"Behavior D": {
{
"id": "004",
"nickname": "Behavior D",
"type": "Dummy"
"display_name": "Behavior D",
"type": "Dummy",
"show": true
},
"Behavior E": {
{
"id": "005",
"nickname": "Behavior E",
"type": "Dummy"
"display_name": "Behavior E",
"type": "Dummy",
"show": true
},
"Behavior F": {
{
"id": "006",
"nickname": "Behavior F",
"type": "Dummy"
"display_name": "Behavior F",
"type": "Dummy",
"show": true
},
"Behavior G": {
{
"id": "007",
"nickname": "Behavior G",
"type": "Dummy"
"display_name": "Behavior G",
"type": "Dummy",
"show": true
},
"Behavior H": {
{
"id": "008",
"nickname": "Behavior H",
"type": "Dummy"
"display_name": "Behavior H",
"type": "Dummy",
"show": true
},
{
"id": "009",
"display_name": "Sequence A",
"type": "Sequence",
"show": false
},
{
"id": "010",
"display_name": "Sequence B",
"type": "Sequence",
"show": false
},
{
"id": "011",
"display_name": "Sequence C",
"type": "Sequence",
"show": false
}

}
]
}
20 changes: 15 additions & 5 deletions src/social_norms_trees/serialize_tree.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import py_trees
from social_norms_trees.custom_node_library import CustomBehavior
from social_norms_trees.custom_node_library import CustomBehavior, CustomSequence


def serialize_tree(tree):
Expand All @@ -18,15 +18,25 @@ def deserialize_node(node):
node_type = node['type']
children = [deserialize_node(child) for child in node['children']]

behavior = behavior_library.get_behavior_by_display_name(node['name'])

if node_type == 'Sequence':
return py_trees.composites.Sequence(node['name'], False, children=children)
if behavior:
return CustomSequence(
name=behavior['display_name'],
id_=behavior['id'],
display_name=behavior['display_name'],
children=children
)
else:
raise ValueError(f"Behavior {node['name']} not found in behavior library")

elif node_type == 'Behavior':
behavior = behavior_library.get_behavior_by_nickname(node['name'])
if behavior:
return CustomBehavior(
name=behavior['nickname'],
name=behavior['display_name'],
id_=behavior['id'],
nickname=behavior['nickname']
display_name=behavior['display_name']
)
else:
raise ValueError(f"Behavior {node['name']} not found in behavior library")
Expand Down

0 comments on commit 5c1e477

Please sign in to comment.